pdbe-組み込みのPythonデバッガーおよびデバッグアシスタント







こんにちは、Habrahabr! この記事では、大規模で馴染みのないシステムをデバッグした経験を共有しますが、実際に作成されたツールpdbeの側からです 。 プロジェクトの最初からプロジェクトのコードの流れを理解するのに役立ちます。 フードの下に隠されているものと使用できる機能に興味がある場合は、猫をお願いします。



pdbeとは



pdbeは、組み込みPythonデバッガーpdbのヘルパーです。これにより、プロジェクト内の任意のファイル、指定されたディレクトリ内のすべてのファイル、またはすべてのディレクトリに隠されているすべてのファイルに、ブレークポイント(後のデバッグ用にプログラムを停止)を挿入できます(再帰的にバイパスします)ファイルを探しているすべてのディレクトリ)。



pdbeアーセナルに隠された興味深い機能が他にもあります。これらの機能は、その使用(およびそれに応じてデバッグも可能)をより楽しく便利なものにします。



やる気



数年にわたってサポートされている、すでに作成されたコードを勉強する必要がある場合、開発中にはさまざまな状況があります。職場、オープンソースのソリューション、およびフレームワークです。 どこから始めてどのように機能するかを知るのは困難です。



私にとっては、 pdbe-各プロジェクト関数にブレークポイントを挿入し、プロジェクトを開始し、サーバーで処理を引き起こし(たとえば、ページを更新し、ライブラリ関数を呼び出し、ソケットを開く)、プロセスの最初からリクエスト処理の終わりまでプロジェクトのデバッグを開始し、それぞれで停止する機能を発見しましたそれを研究する機能。



他のオプションもあります-プロジェクトは既に知っていますが、コードのデバッグは依然として困難です。内部のすべてがどのように機能するかを覚えておくことが理想的だからです。 次に、 pdbeに確認 」して、別のプロジェクトアプリケーションにのみブレークポイント挿入できます。



設置



ここではすべてが簡単です。パッケージはPythonで記述されているため、pipを使用してインストールできます。



$ pip3 install pdbe
      
      





使い方



作業方法を理解しやすくするために、プロジェクトのすべてのpythonファイルに次のコードがあり、その例を使用してpdbeのパフォーマンスを確認するとします。



 def first_function(): ... def second_function(): ... def third_function(): ...
      
      





主な機能



import pdbの形式でブレークポイントをインポートします 指定されたファイルへのpdb.set_trace() (ファイルの場合は--fileフラグ)。



 $ pdbe --file project/file_flag.py
      
      













サンプルプロジェクトを使用した以下のファイルのデバッグカバレッジの図解



その結果、次のようになります。



 def first_function(): import pdb; pdb.set_trace() ... def second_function(): import pdb; pdb.set_trace() ... def third_function(): import pdb; pdb.set_trace() ...
      
      





ファイルを元の状態に復元するには、追加フラグ--clearを使用します。 この種のすべてのチームには、ブレークポイントからファイルをクリアする機能があります。



 $ pdbe --file project/file_flag.py --clear
      
      





上記のように、アプリケーションの一部(いくつかのファイルがあるフォルダー)をデバッグする必要がある場合は、-- dirフラグを使用する価値があります。



 $ pdbe --dir project/dir_flag
      
      











サンプルプロジェクトを使用した以下のファイルのデバッグカバレッジの図解



その結果、指定されたディレクトリ内のすべてのファイルに式import pdbが含まれます。 それらに存在する各関数の下のpdb.set_trace()



同じ原則 、ファイルのあるサブフォルダーを非表示にできるディレクトリにも適用されます( --ewフラグ。これは、 あらゆる場所の単語の略語です)。



 $ pdbe --ew project
      
      





この場合、すべての添付ファイルにはブレークポイントが含まれます。

既にプロジェクトにいる場合は、フォルダーの代わりにピリオドを使用できます。



 $ pdbe --ew .
      
      











サンプルプロジェクトを使用した以下のファイルのデバッグカバレッジの図解



上級レベル



デバッグの状態 (ファイルの実際の状態)を保存できます。 これは、ブレークポイントが現在どこにあるかを思い出すように要求するときです。したがって、将来、そこからブレークポイントを削除したときに、1つまたは2つのpdbeコマンドで再びそれらに戻ります。 例で説明します。



 def first_function(): ... def second_function(): ... def third_function(): ...
      
      





すでにご存じのとおり、 pdbe --file path / to / file.pyコマンドはファイルを次のように変換します。



 def first_function(): import pdb; pdb.set_trace() ... def second_function(): import pdb; pdb.set_trace() ... def third_function(): import pdb; pdb.set_trace() ...
      
      





このファイルにブレークポイントを入力し、このデバッグ状態に名前を付けたことを思い出してください。 たとえば、ファイルにメッセージ処理ロジックが含まれている場合、次のように記述できます。



 $ pdbe --commit 'Message handler debug'
      
      





次に、ユーザーレベルでコードを確認する必要があるとすぐに、デバッグモードがオンにならないようにファイルをクリアします。



 $ pdbe --file path/to/file.py --clear
      
      





その結果。



 def first_function(): ... def second_function(): ... def third_function(): ...
      
      





数時間、数日、またはチケットの後、同じロジックを再度デバッグする必要があります。 確かに、同じ場所にブレークポイントを設定すると、実際にこのすべてを抽象化して、作業しやすくすることができればうれしいです。



コミットログを確認します。



 $ pdbe --log
      
      





結果:



 commit | add336b6a204bb7b3abe76c296b67f92 date | 23:17:00 29-01-2018 message | Message handler debug commit | 4401cbeae73aece0216de9f4874451b6 date | 23:11:22 29-01-2018 message | Users REST API get view
      
      





コミットの日付やメッセージによって、まさに必要なものを思い出します。 その時点でのデバッグの状態を復元するために、コミットのハッシュを使用します。



 $ pdbe --checkout add336b6a204bb7b3abe76c296b67f92
      
      





最終的に、コミット時にすべてが返されました。



 def first_function(): import pdb; pdb.set_trace() ... def second_function(): import pdb; pdb.set_trace() ... def third_function(): import pdb; pdb.set_trace() ...
      
      





追加予定



  1. ロガー `a。 アプリケーションの実行順序をトレースするだけでよい場合もあります。
  2. 関数、クラス、またはその他のオブジェクトの名前を入力し、プロジェクト全体でオブジェクトとの関係の図を取得できる追加機能。


公開に時間を割いていただきありがとうございます。 pdbeに興味がある場合は、プロジェクトのGithubページにアクセスしてください 。 フィードバックや提案がある場合は、プライベートメッセージに書き込みます。



All Articles