ロックされた後、マルチスレッドのPythonアプリケーションでデッドロックをデバッグしようとしています。デバッガをアタッチしてプロセスの状態を検査する方法はありますか?マルチスレッドのPythonプロセスにデバッガを接続する方法はありますか?
編集:私はLinuxでこれを試していますが、クロスプラットフォームのソリューションがあれば素晴らしいことでしょう。結局のところPythonです:)
ロックされた後、マルチスレッドのPythonアプリケーションでデッドロックをデバッグしようとしています。デバッガをアタッチしてプロセスの状態を検査する方法はありますか?マルチスレッドのPythonプロセスにデバッガを接続する方法はありますか?
編集:私はLinuxでこれを試していますが、クロスプラットフォームのソリューションがあれば素晴らしいことでしょう。結局のところPythonです:)
どのプラットフォームでこれを試していますか?ほとんどのデバッガでは、プロセスIDを使用して実行中のプロセスにアタッチすることができます。 プロセスIDをログ出力するか、タスクマネージャのようなものを使用して出力できます。 これが達成されると、個々のスレッドとその呼び出しスタックを検査することが可能になります。
EDIT:クロスプラットフォームであるGNUデバッガ(GDB)での経験はありませんが、これはlinkで、正しいパスで起動します。デバッグシンボルを追加する方法(スタックトレースを読み込むのに便利)とgdbに実行中のPythonプロセスをアタッチする方法を説明します。
もしあなたがpydbを意味するのであれば、それを行う方法はありません。その方向に少しの努力がありました: see the svn commitしかしそれは放棄されました。おそらくwinpdb supports it。
PyDev(Windows XPのEclipse)でマルチスレッドプログラムをデバッグした経験は、thread.start_new_threadを使って作成したスレッドをフックすることはできませんでしたが、threading.Threadを使ってスレッドを作成することができました。情報が役立つことを願っています。
あなたはマルチスレッドのPythonプロセスにデバッガをアタッチすることができますが、Cレベルでそれを行う必要があります。何が起こっているのかを理解するためには、Pythonインタプリタをシンボルでコンパイルする必要があります。お持ちでない場合は、python.orgからソースをダウンロードし、それを自分で構築する必要があります:
./configure --prefix=/usr/local/pydbg
make OPT=-g
sudo make install
sudo ln -s /usr/local/pydbg/bin/python /usr/local/bin/dbgpy
ワークロードは、インタプリタのバージョンで実行されていることを確認してください。その後、いつでもGDBでアタッチできます。 Pythonの人々はいくつかの便利なマクロを持っているMiscディレクトリにサンプル ".gdbinit"を含めています。しかし、それはマルチスレッドのデバッグ(!)のために壊れています。あなたは、次のと、この
while $pc < Py_Main || $pc > Py_GetArgcArgv
のような行を交換する必要があります。
while ($pc < Py_Main || $pc > Py_GetArgcArgv) && ($pc < t_bootstrap || $pc > thread_PyThread_start_new_thread)
そうでない場合は、メインスレッド以外のスレッドで終了しませんpystack
などのコマンド。このようなものがあれば、
gdb> attach <PID>
gdb> info threads
gdb> thread <N>
gdb> bt
gdb> pystack
gdb> detach
のようなことができます。やや。
「pyo」マクロを使用してオブジェクトの内容を解析できます。彼のブログにChris has some examples
幸運。
(私のためにいくつかの重要な情報についてDan's blogについてShoutout、特にスレッドフィックス!)
使用Winpdb。 プラットフォームに依存しないグラフィカルなGPL Pythonデバッガで、ネットワーク、複数のスレッド、名前空間の変更、埋め込みデバッグ、暗号化された通信を介したリモートデバッグをサポートし、pdbより20倍高速です。
特長:
Screenshot http://winpdb.org/images/screenshot_winpdb_small.jpg
pdbinjectすでに実行しているpythonのプロセスにPDBを注入することができます。
実行ファイルpdbinjectは、python2でのみ動作しますが、python3にも正しく挿入できます。
PyCharm IDEバージョン4.0以降、実行中のPythonプロセスにアタッチすることができます。
が記載されています。
サイトは404です。 ここに手順を含めてください。 – luckydonald