2009-10-26 15 views
10

私は子プロセスを作成するためにsubprocess.Popenを使用するコードをデバッグする方法を見つけるためにEclipse/PyDevを使用しています。作成された子プロセスをデバッグできるようにします。問題は、プロセス境界全体をデバッグする方法を見つけることができず、実際には不可能であると推測していることです。それでも、あなたが尋ねるまで、あなたは決して知りません。pydevを使ってサブプロセスをデバッグする方法はありますか?

背景のビット:私は、必要に応じてnoseに出て呼び出すことによって、私たちのユニットテストを呼び出すWafで駆動される複雑なビルドプロセスを持っている:私は、デバッグユニットテストの失敗に、これらのプロセスにフックします。私は鼻を直接動かすことができるのは分かっていますが、正しくロードするために私たちのモジュール用に設定しなければならない環境はかなり複雑で、避けることができるなら、コードを複製したくありません。

私はremote debuggingモードを認識していますが、リモートプロセスで手動でデバッガを起動する必要があるため、かなり不便です。私がしようとしていることを誰かがやっている方法を知っていれば、それは非常に高く評価されます。

+0

この質問とその回答はかなり古いですが、Raphaelから現在受け入れられている回答ではなく、pimlottcの回答を受け入れることをお勧めします。ラファエルの答えは与えられたときに正しいと思われるかもしれませんが、ピムロッツクの答えは今では絶対に正確で非常に有用です。 – skrrgwasme

答えて

4

私はPyDevがそれを行うことはできません(PyDbgとWinDbgはできません)が、gdbは:http://wiki.python.org/moin/DebuggingWithGdbのように見えます。

+0

フォークをサブプロセスにフォローすることはできますか、またはサブプロセスに手動でアタッチすることを提案していますか?興味深いことに、GDBがPythonスタックを検査できることを知りたいと思います。私はそれを知りませんでした:) – jkp

+0

私は、手動でプロセスにアタッチすることを提案しています。 –

+1

実際に手動で取り付ける必要があるという制限は、実際にはUnixシステムの仕組みの結果であり、特定の言語やデバッガに固有のものではありません。 –

3

私はあなたに適した回避策を見つけました。

私は最初にpydevd.settrace()への呼び出しを手動で目的のブレークポイントに挿入するリモートデバッグオプションを見つけました。しかし、その後のPyDevブレークポイント(つまり、左マージンをクリックすることによって作成されたブレークポイント)に従ったことにも気付きました。したがって、プロセスのリモートデバッグセッションを確立するための最初の明示的なsettrace呼び出しが必要で、その後は通常のデバッガブレークポイントを使用するだけであるようです。それは実際にプロセスを中断しないように

また、あなたはsettraceコールを変更することができます。

import pydevd 
pydevd.settrace(suspend=False) 

をだから、どこか早いサブプロセスの初期化中に上記のコードを挿入して、あなたは良いことがあります。まだ少しのハックですが、手動の方法よりもはるかに優れています。

+1

settraceをサブスレッドに適用するための追加のフラグもありますが、それは確実に私にとってはうまくいきません:pydevd.settrace(suspend = False、trace_only_current_thread = False) – pimlottc

+0

PyDev 1.6.4以降、サブスレッドの追跡が機能します私のために良い。 pydev.settrace(...)呼び出しはメインスレッドに置かれます。 –

関連する問題