たとえ、クリーンで効率的で読みやすいコードを書き、ユニットテストケースでコードのカバレッジを良くしたとしても、一度書いたらずっと完璧に実行することは不可能です。
ほとんどの場合、バグは避けられないものであり、デバッグは開発者の日常生活の一部となっています。
したがって、デバッグのトリックを学ぶことは、あなたやあなたのコードのパフォーマンスと効率を向上させます。
この記事では、Pythonでより簡単にデバッグを行うためのトリックやツールを紹介します。
ストラテジー
効果的なデバッグの最初の、そして最も重要なステップは、実際のエラーを特定することです。
エラーの詳細を把握したら、エラーの場所を見つけ、エラーの状態や問題の根本的な原因を分析し、解決することが必要です。
適切なツールとともに、適切な戦略を持つ必要があるのです。
デバッグには2つの戦略があります。
ひとつは前方分析、もうひとつは後方分析です。
前方分析法では、デバッガモードでコードを再実行し、疑わしい行にブレークポイントを設定し、デバッグを行います。
前方分析を行うには、pdbやIDEを使用すると効率的にデバッグを行うことができます。
後方解析は、エラーが発生したときに本番環境から収集したログを利用して問題を追跡する方法です。
後方分析を行うには、print関数、logger、スナップショットなどのツールが機能します。
後方分析と前方分析を組み合わせたリアルタイムデバッグは、後述するLightrun Cloudのようなツールを使って実装することができる。
このようなツールを使うことで、開発者は、モノリスやレガシー・アプリケーション、マイクロサービス、分散システムなど、あらゆるタイプのアプリケーションでリアルタイム・デバッグを行うことができる。
APMや他のDevOpsツールと統合することで、開発者はスナップショット、ログ、パフォーマンスメトリクスにアクセスし、バグを特定して効率的に問題を解決することができる。
Pythonデバッガ(pdb)による前方分析
pdbはPythonのビルトインデバッガツールです。
web-pdbのような他のツールもありますが、ほとんどの場合、pdbは十分便利です。
pdbでプログラムを実行するには、以下のコマンドを実行します。
python -m pdb addition.py
プログラムは最初のステップの実行を開始します。
もし、スキップして全コードを実行したい場合は、1を押してください。
次の行を実行するにはnを押してください。
これにより、変数の値と実行の流れを理解することができます。
コードが大きく、ブレークポイントを設定したい場合は、set_trace メソッドを使用します。
IDEデバッガによる前方分析
ほとんどの IDE には、ブレークポイントの設定、ステップオーバー、ステップイン、継続など、多くの機能が備わっています。
これらのコマンドは、開発者が効率的にデバッグするのに役立ちます。
現在、Pythonで利用可能な優れたIDEには以下のようなものがあります。
PyCharm。
JetBrains社のPyCharm IDEは、デバッガとテストランナーを統合し、膨大な数のツールも付属しています。
Visual Studio Code。
Visual Studio Codeは、Microsoft PythonエクステンションでPythonをサポートしています。
Windows 10または11を使用していて、Linuxシステム用のアプリケーションを構築している場合、WSLは開発とテストを行うための素晴らしい方法です。
Visual StudioとRemote WSL拡張、Python拡張を組み合わせることで、開発者はWSLで実行しながら編集やリモートデバッグにアクセスすることができます。
いくつかのケースでは、同様のシナリオを再現することができません。
そのような場合、後方分析は、開発者が問題を特定し、解決するのに役立ちます。
プリント/アサート機能による後方分析
デバッグの最もシンプルで強力な方法は、変数やイベントメッセージをコンソールに出力し、出力された値が期待したものなのか、それともコード実行中に何か問題が発生したのかを確認することです。
print文の問題を克服するために、開発者はassert文を使用することができます。
Pythonの組み込みのassertメソッドは、そのステートメント条件が満たされない場合、AssertionErrorを発生させることができます。
Pythonはassertを使用する際に有効か無効かを柔軟に選択することができます。
コードを実行中に -0 引数を使用すると、プログラム内のすべての assert ステートメントを閉じることができます。
その後、すべてのassertメソッドは動作しなくなります。
それでも、assert文がたくさんあると、コードが読みづらくなり、少し混乱します。
この記事もチェック:Pythonのmapメソッドの使い方|ラムダ関数や引数が複数の場合の使い方も解説
ロガーによる後方分析
printステートメントをすべてloggerに置き換えることは、ログステートメントをデバッグするための最も専門的で強力な方法です。
有効化・無効化の自由度が高いので、開発者にとっては重い武器になります。
さらに、特定のログを有効にするために、ログレベルを設定することができます。
ログステートメントでデバッグする最も簡単な方法のひとつは、すべてのメソッドに debug ステートメントを追加することです。
そのため、任意のメソッドが実行されると、そのメソッドは引数の値とともにデバッグステートメントを記録します。
すべてのメソッドにログステートメントを記述する代わりに、 デコレーター関数を使用すると、引数の値を内部的にログに記録することができます。
以下のコード・スニペットを使用して、デコレーター関数を作成し、引数を表示したいすべてのメソッドの前に @enable_args_debugger を追加してください。
ライトランクラウド
アプリケーションがクラウドかオンプレミスか、アプリケーションサーバーかサーバーレスか、コンテナ化されているかどうかに関わらず、Lightrun Cloudは開発者が簡単に問題を特定し、迅速に解決できるようにする無償ツールです。
配信時間を短縮し、コードを変更することなくリアルタイムでログやスナップショットを追加できる柔軟性を備えています。
Lightrun のログを使ったリアルタイムデバッグ
コードが出荷された後、ログやassert文を追加するのは面倒な作業です。
数行の変更のために CI/CD パイプラインを呼び出す代わりに、Lightrun Logs を使ってログを追加することができます。
本番システム上のランタイムで好きなだけログを追加することができます。
主要なIDEと統合することができます。
このツールを使えば、開発者は自由にベルやホイッスルの下のコアなビジネスロジックに集中することができます。
Lightrun スナップショットによるリアルタイムデバッグ
開発者が実行の流れを把握するのに苦労するケースは少なくありません。
スタックトレースと変数があれば、ロジックに抜けがないか、条件実行が期待通りにいかないか、開発者は簡単に理解することができます。
Lightrunスナップショットは、システムを破壊することなくすべてのデータを抽出する仮想ブレークポイントです。
Lightrunでは、条件付きスナップショット、使用しているIDEとの統合、システムを壊すことなくスナップショットを好きなだけ追加することができます。
Lightrunのパフォーマンスメトリクスを用いたリアルタイムデバッギング
バグはロジックの抜けや間違えだけではありません。
ボトルネックになったり、長いクエリになったりすることもあります。
これらのパフォーマンスに関するバグは、Lightrun を使って対処することができます。
ログの例と一緒にパフォーマンスメトリックスの監視を追加したり、特定のコードの実行回数を数えたり、2つの関数の実行間の時間を測定したり、レイテンシーやスループットカウンターのようなシステム統計情報を収集したりすることができます。
開発者やDevOpsエンジニアは、リモートデバッグ、ログシッピング、アプリケーションパフォーマンス監視、メモリスナップショットなど、それぞれのデバッグ戦略に応じて複数のツールを使用しています。
しかし、Lightrun Cloudは、ロギング、メトリクスとAPM、スナップショット、リモートデバッグなど、デバッグに関するすべての開発者のニーズを満たすことができる場所なのです。
また、様々なDevOpsツールと連携しているため、その利点をスムーズに導入することができます。