スレッド、プロセス、およびデータベースへの接続を処理する Python スクリプトがあります。スクリプトを実行すると、python がクラッシュします。
これが発生するケースを明示的に検出することはできません。
現在、Python がクラッシュしたときに詳細情報を取得するためのツール、または作成したすべてのプロセス/接続を表示するためのビューアーを探しています。
プロセス内の例外の完全なトレースバックを表示するモジュールRemoteException.pyを作成しました。Python2. それをダウンロードして、これをコードに追加します。
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
古い答え
私にも問題がありました。
これは私がやったことです...マルチプロセッシング呼び出しをデバッグするRemoteException
file.write('\nin %s ' % (Process.thisProcess,))
ソースをコピーし、19行目と次の行
を削除
します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
あなたのケースはわかりませんが、スレッドまたはマルチプロセッシングを使用している場合、コードは並列処理に適用できます(通常)。難しい場合は、プールなしで関数を呼び出すだけですべてを実行し、エラーをキャッチしてから、プールに再度移動します。
特定の Python プロセスに従うオプションを提供する WinPDB と呼ばれるグラフィカル デバッガーがあります。ステップ スルーして、コール スタックのさまざまな場所にあるすべての変数を確認できます。
フォーク時にどのプロセスに従うかを選択できます。
最終的な例外もキャプチャし、その発生場所を確認できます。