2

そこの。誤動作しているPython3.1用に記述されたコードがあります。それがCコードの場合は、gdbserver最初に使用し、プロセスにアタッチし(Pythonプロセスがstdinで入力を受け取る、かなり洗練されたコマンドラインに含まれます)、お気に入りのGDBフロントエンドを起動します。なぜそれがうまくいかないのかを理解する準備をしてください。

しかし、それはpythonです。モジュールを試したばかりpdbですが、プロセスがオフになったときに中断できません。代わりに「KeyboardInterrupt」が表示されます(コマンドチェーンの残りの部分を変更して、実行できるようにする必要がありset_ptraceます)。

winpdbを試してみましたが、奇妙なエラーメッセージが表示されました

   Unhandled Exception (in pyshared/rpdb2.py)

プロセスに接続する前に「パスワード」を要求しました。これは、winpdbがpython2専用であるという全体的な感覚を与えてくれます。

実行中のプロセスにアタッチするために試したところgdb __main__.py、想像できるように「フォーマットが認識されません」と表示されます。

見逃したマンページはどこにありますか?

PS:ああ、それが重要なのであれば、それはマルチスレッドプロセスです。

最小限の例:

import pdb

pdb.set_trace()  # press 'c' here to continue
while(True):
    print("hi")  # hit CTRL+C here ... will just kill the program with python 3.1

print("ooh")
4

4 に答える 4

3

pdbを使用する一般的な方法は、次の行を入力することです。

import pdb;pdb.set_trace()

休憩したい場所。休憩を条件付きにしたい場合は、次のように条件を追加するだけです。

if x > 1000:
    import pdb;pdb.set_trace()

CTRL-Cは含まれていません。

ただし、pdbモジュールにスクリプトを実行させると、CTRL-Cフックがインストールされます。

python3 /path/to/stdlib/pdb.py myscript.py

それを書くためのより短くて簡単な方法は次のとおりです。

python3 -m pdb myscript.py

一部のLinuxディストリビューションでは、/ usr / binにあるpdb.pyへのリンクも作成されます。つまり、コマンドとして取得できます。

pdb3 myscript.py

上記の3つのコマンドはすべて同じことをします。pdb.set_trace()ただし、CTRL-Cを押すと事後デバッグが開始されるため、これはとは異なります。つまり、次のステップはプログラムを終了するため、コードをステップスルーすることはできません。したがって、上記の手法よりもはるかに有用性が低くなります。ただし、実行速度が遅いときにコード内の何に時間がかかっているかをすばやく把握する方法であり、正しい場所にset_trace()を配置して、その理由を把握することができます。スロー。

また、上記で示したように、Python3.1では壊れているようです。ただし、Python3.2では機能します。

単純な場合にのみ機能しますが、より複雑な場合は、プロファイリングを使用して原因を見つける必要があります。

于 2012-08-11T07:13:01.667 に答える
1

私はpdbこれに使用していますが、これは私にとっては問題なく機能します。Ctrl-Cを押すと、プログラムの状態を事後デバッグでき、トレースバック内のすべてのスタックフレームにアクセスできるようになります。ライブデバッグを行う場合は、Ctrl-Cが発生した場所にブレークポイントを設定して、最初からやり直してください。

于 2012-08-10T10:25:46.360 に答える
0

オンデマンドの割り込みとPythonインタープリターのデバッグを組み合わせる方法は、SIGUSR1などの別のシグナルset_trace()を使用して、グローバルな「デバッグ」フラグを変更し、 debugging==Trueのときに条件付きで呼び出すことです。

于 2012-08-24T08:59:47.567 に答える
0

したがって、これまでの私の最善の策は、pdb(実際)を使用することですがset_trace()、KeyboardInterruptが発生したときにのみ呼び出すことです。これがPython3.1で唯一機能する方法のようです

于 2012-08-10T13:32:49.207 に答える