web-dev-qa-db-ja.com

pdbで後方にステップすることは可能ですか?

Nを押して行を評価した後、戻り、sを押して失敗した場合にその関数にステップインします。これは可能ですか?

ドキュメントは言う:

j(ump)lineno実行される次の行を設定します。一番下のフレームでのみ使用できます。これにより、ジャンプしてコードを再実行したり、実行したくないコードをスキップしてスキップしたりできます。

45
YPCrumble

GNUデバッガー、gdb:一度に1つのマシン命令を元に戻すため、非常に低速です。

Pythonデバッガー、pdb:jumpコマンドは、コードを逆方向に戻しますが、プログラムの状態を反転しません。

Pythonの場合、拡張されたpythonデバッガプロトタイプepdbは、このために作成されました。ここに thesisプログラムとコード です。

私は修士課程の一環としてライブリバースデバッガーを作成するための出発点としてepdbを使用しました。論文はオンラインで入手できます: コンピュータープログラミングの視覚的思考に向けたリバースデバッグとライブプログラミングの組み合わせ 。第1章と第2章では、リバースデバッグの歴史的なアプローチのほとんどについても説明します。

33
Abraham

PyPyは、逆デバッグをサポートする RevDB の実装を開始しました。

(2017年2月現在)まだアルファ段階で、Python 2.7のみをサポートし、LinuxまたはOS Xでのみ動作し、ビルドする必要がありますPython =自分自身を特別なリビジョンから作成することも非常に遅く、多くのRAMを使用します。Bitbucketページを引用するには:

通常、ログファイルは毎秒1〜2 MBの割合で増加します。サイズが問題ではないと仮定すると、制限要因は次のとおりです。

  • 再生時間。記録された実行に数分以上かかった場合、再生は非常に遅くなります。 1回のセッションでログ全体を数回調べる必要がある場合があります。バグがランダムに発生するがまれに発生する場合は、数分間記録を実行し、プロセスを強制終了して、クラッシュするまで繰り返し再試行する必要があります。
  • 再生のRAM使用量。 RAM要件は、記録よりも再生の10または15倍大きくなります。それが大きすぎる場合は、_revdb/process.pyのMAX_SUBPROCESSESの値を低くしてみてください。ただし、数倍大きくなります。

詳細は PyPyブログ にあり、インストールと使用方法の説明は RevDB bitbucketページ にあります。

10
SimeonJM

リバースデバッグ(以前に記録されたアプリケーション状態に戻る、または逆方向のシングルステップデバッグ)は、通常、アセンブリまたはCレベルのデバッガー機能です。例えば。 gdbでできること:

https://sourceware.org/gdb/wiki/ReverseDebug

双方向(または逆)デバッグ

リバースデバッグは非常に複雑で、パフォーマンスが50.000x低下する可能性があります 。また、デバッグツールからの広範なサポートが必要です。 Python仮想マシンはリバースデバッグサポートを提供しません。

インタラクティブに評価する場合Pythonコードを試すことをお勧めします IPython Notebook HTMLベースのインタラクティブなPythonシェルを提供します。コードと順序を組み合わせて一致させます。ただし、pdbのデバッグサポートはありません。 ipdb を使用すると、入力されたデバッグコマンドの履歴と検索機能が向上しますが、後方ジャンプも行いません。私の知る限りでは。

10
Mikko Ohtamaa