2008-09-06 8 views
26

ロックされた後、マルチスレッドのPythonアプリケーションでデッドロックをデバッグしようとしています。デバッガをアタッチしてプロセスの状態を検査する方法はありますか?マルチスレッドのPythonプロセスにデバッガを接続する方法はありますか?

編集:私はLinuxでこれを試していますが、クロスプラットフォームのソリューションがあれば素晴らしいことでしょう。結局のところPythonです:)

答えて

10

gdbは低レベルのデバッグに適しています。

スレッドコマンドでスレッドを変更できます。

例えば

(gdb) thr 2 
[Switching to thread 2 (process 6159 thread 0x3f1b)] 
(gdb) backtrace 
.... 

またWinpdb、またはpydbのようなPythonの特定のデバッガをチェックアウトすることができます。どちらもプラットフォームに依存しません。

0

どのプラットフォームでこれを試していますか?ほとんどのデバッガでは、プロセスIDを使用して実行中のプロセスにアタッチすることができます。 プロセスIDをログ出力するか、タスクマネージャのようなものを使用して出力できます。 これが達成されると、個々のスレッドとその呼び出しスタックを検査することが可能になります。

EDIT:クロスプラットフォームであるGNUデバッガ(GDB)での経験はありませんが、これはlinkで、正しいパスで起動します。デバッグシンボルを追加する方法(スタックトレースを読み込むのに便利)とgdbに実行中のPythonプロセスをアタッチする方法を説明します。

3

もしあなたがpydbを意味するのであれば、それを行う方法はありません。その方向に少しの努力がありました: see the svn commitしかしそれは放棄されました。おそらくwinpdb supports it

3

PyDev(Windows XPのEclipse)でマルチスレッドプログラムをデバッグした経験は、thread.start_new_threadを使って作成したスレッドをフックすることはできませんでしたが、threading.Threadを使ってスレッドを作成することができました。情報が役立つことを願っています。

6

あなたはマルチスレッドの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、特にスレッドフィックス!)

13

使用Winpdbプラットフォームに依存しないグラフィカルなGPL Pythonデバッガで、ネットワーク、複数のスレッド、名前空間の変更、埋め込みデバッグ、暗号化された通信を介したリモートデバッグをサポートし、pdbより20倍高速です。

特長:

  • GPLライセンス。 Winpdbはフリーソフトウェアです。 2.6とPython 3000通じCPythonの2.3との互換性
  • 独立したプラットフォーム
  • 2.8通じwxPythonの2.6との互換性、およびUbuntuの勇敢およびWindows XP上でテスト。
  • ユーザーインターフェイス:rpdb2はコンソールベースですが、winpdbにはwxPython 2.6以降が必要です。

Screenshot http://winpdb.org/images/screenshot_winpdb_small.jpg

0

pdbinjectすでに実行しているpythonのプロセスにPDBを注入することができます。

実行ファイルpdbinjectは、python2でのみ動作しますが、python3にも正しく挿入できます。

0

PyCharm IDEバージョン4.0以降、実行中のPythonプロセスにアタッチすることができます。

​​が記載されています。

+0

サイトは404です。 ここに手順を含めてください。 – luckydonald

関連する問題