2012-11-23 18 views
7

私は、スレッド、プロセス、およびデータベースへの接続で動作するpythonスクリプトを持っています。 スクリプトを実行すると、pythonがクラッシュします。マルチプロセスのためのpythonデバッグツール

これが発生した場合は、明示的に検出できません。

私は、pythonがクラッシュしたときに、 またはビューアで作成したすべてのプロセス/接続を表示するためのツールを探しています。

+0

私はスレッドを使って作業を始めました。そして、私はどこでも、logging.debug( "私はそれを関数Xに作った")を使ってしまいました。 –

+0

Windowsを使用していますか?その場合は、Pythonのデバッグビルドをビルドして実行してみましたが、Visual Studio(クラッシュ後)とクラッシュ場所に「ブレーク」(一時停止ボタン付き)を付けてクラッシュしたときにコールスタックをキャプチャしましたか?編集:明確にするために、あなたのスクリプトはPython自体(あなたのスクリプトではない)を機会にクラッシュさせるのでしょうか? – Cameron

+0

障害ハンドラモジュールがあります。 [適切な注意を払わずにスレッドとマルチプロセッシングを混在させる]問題があります(http://stackoverflow.com/questions/12984003/status-of-mixing-multiprocessing-and-threading-in-python) – jfs

答えて

1

あなたのケースはわかりませんが、スレッドまたはマルチプロセッシングを使用する場合、コードは並列処理(通常)に適用されます。困難な場合は、プールなしで関数を呼び出すだけですべてを行い、エラーをキャッチしてプールに戻ってきます。

0

WinPDBというグラフィカルなデバッガがあり、特定のPythonプロセスに従うことができます。コールスタックのさまざまな場所にあるすべての変数をステップバイステップで表示することができます。

フォークでどのプロセスをフォローするか選択できます。

最終的な例外をキャプチャして、どこから発生したのかを確認することもできます。

http://winpdb.org/

3

私は、プロセス内の例外の完全なトレースバックを示しモジュールRemoteException.pyを作成しました。 Python2。 Download itとあなたのコードにこれを追加します。

import RemoteException 

@RemoteException.showError 
def go(): 
    raise Exception('Error!') 

if __name__ == '__main__': 
    import multiprocessing 
    p = multiprocessing.Pool(processes = 1) 
    r = p.apply(go) # full traceback is shown here 

OLD ANSWERを

私も、問題を抱えていました。

これは私がやったことある...デバッグマルチプロセッシングへのRemoteExceptionは

RemoteException.py

はソースをコピーして、19行を削除呼び出します。 file.write('\nin %s ' % (Process.thisProcess,)) とライン import Process

問題があります:マルチプロセッシングは例外を転送するだけですが、トレースバックは失われます。 以下のコードは、トレースバックを保存するExceptionオブジェクトを作成します。呼び出しプロセスでそれを表示します。あなたのコードで、その後

import RemoteException 

def f(): 
    try: 
     # here is code that fails but you do know not where 
     pass 
    except: 
     ty, err, tb = RemoteException.exc_info() # like sys.exc_info but with better message 
     raise ty, err, tb 

# here follows your multiprocessing call to f 
0
pip install celery 

Remote Debugger:6899: Ready to connect: telnet 127.0.0.1 6899 

Type `exit` in session to continue. 

Remote Debugger:6899: Waiting for client... 
:これは、リモートPDBのように動作し、以下のような

from celery.contrib import rdb; rdb.set_trace() 

スクリプトで

あなたはこのような何かを行うことができます

別のウィンドウからtelnet localhost 6899とpdbの全機能を利用できます。

関連する問題