2013-09-23 9 views
5

Linuxサーバ上で動作するマルチスレッドPythonアプリケーションがあります。私はPyDevのDebug Serverを使ってリモートからデバッグすることができます。これは非常に貴重なデバッグリソースのようです。しかし、私が見ている問題は、それが私が望むほど役に立たないことです。MainThread以外のスレッドでPyDevがサスペンドするようにする

私のアプリケーションがサーバー上で動作している間に、もう1つのボックスでEclipseに入り、MainThreadを一時停止し、その時点でのスタックトレースを取得してから実行を再開できます。それは素晴らしい。しかし、私が子スレッドの1つを試してみると、サスペンド・ボタンがグレーアウトされますが、スタック・トレースはなく、すべてが正常に実行されます。デバッグウィンドウには子スレッドがあり、それはPIDですが、本当に制御できないか、それが何であるかを見ることはできません。右クリックして参考になる「コピースタック」を試してみると、「スレッド-4 - pid29848_seq5」が得られます。

ブレークポイントは正常に機能しているようです。子スレッドがそれらのスレッドのうちの1つに当たった場合、私はステップバイステップで変数などを見ることができます。しかし、それを有効に使用するには、コードに特定の関心のある点があることが必要です。私は本当に私のアプリケーションを実行したいと思っています。珍しい状態になったら、PyDevを使って何が起きているのかを見てください。

セットアップに何か問題がありますか?これは私が反対しているPyDevの単なる制限ですか?どのように子スレッドで何が起こっているのを見ることができますか?

+0

私は同じ問題があります。 Eclipse、PyDev、Django、manage.py runserver --noautoreloadコマンドを使用したリモートサーバーいいえ、私はビューのいずれかでブレークポイントを設定することはできません。 –

+0

私はpythonコードのget viewメソッドの1つにtime.sleep(10000)を追加しました。PyDevにはスタックが見えません。スレッドは見えますが、スタックはありません。 –

+0

だから私は、スレッドの中にスタックを見ることができるようになったのです。pydevd.settrace(suspend = False)、ブレークポイントの直前、しかし、なぜこれが必要なのか分からないのは、settrace()のためのpython独自のドキュメントによると、 "スレッドモジュールから開始されたすべてのスレッドのトレース機能を設定するからです。"これをさらに検討する予定です。 –

答えて

-2

Pythonは実際にスレッドを正しく実行しません(GILは片方向または別の方法でコックのものに縛られています)、それらをデバッグすることがスリリングな経験ではないと私は驚きません。最新のGDBとCDTであっても、C/C++スレッドをデバッグするのは良いことではありません。

私は実際にはわかりませんが、複数のスレッドではなく複数のプロセスを採用することで、経験が向上するかもしれません。 Eclipse/PyDevの単一のインスタンスが単一のPythonプロセスをデバッグするように整理すると、画面上に多くのウィンドウが表示されることがありますが、これはもっと柔軟なデバッグ環境になります。

私は、VxWorksのCではスレッドやプロセスだけのタスクがなかったので、以前は何をしていたのですか?結局のところ、タスクごとにデバッガを走らせることができたことは素晴らしいことでした。

0

私はファビオのポストの1を見た後、それを把握するために管理:あなたはpydev.settrace(呼び出した後

threading.settrace(pydevd.GetGlobalDebugger().trace_dispatch) 

を追加する必要がある)

関連する問題