web-dev-qa-db-ja.com

Eclipseでの複数のスレッドのデバッグ

私がデバッグしているメソッドでは、新しいスレッドを生成しています。親スレッドではなく、この新しいスレッドの実行をデバッグする必要があります。どうすれば日食でこれを行うことができますか?

59

新しいスレッドの「run」メソッドにブレークポイントを設定します。スレッドが開始すると、実行が停止します。

36
Shamit Verma

Shamit Vermaの答えに加えて:

マルチスレッドJavaアプリケーションのデバッグを扱う場合、ブレークポイントが設定されているスレッドだけを中断する標準のブレークポイントを使用しない方が良いです。アプリケーションで標準ブレークポイントを定義すると、関連するスレッドのみが破損します。他のスレッドは引き続き実行されます。何らかの理由でEclipseデバッガーでは、他のスレッドが既に開始されている場合、デバッガーはブレークポイントをスキップします。

Javaをデバッグするためのソリューション:

目的のスレッドにブレークポイントを定義します(@ Run()メソッドi ..)、ブレークポイントで右クリック->ブレークポイントプロパティ。

ブレークポイントプロパティダイアログで、[スレッドの一時停止]ではなく[VMの一時停止]にチェックマークを付けます。

このようにすると、ブレークポイントに到達した場合にVM全体が中断されます。

C/C++ CDTでは、useset scheduler-locking on

@Employed Russianが answer-to-other-question で述べているように、GDBコマンド:

set scheduler-locking on 

現在のスレッドのステップ実行を許可する間、他のC/C++スレッドが中断されたままになります。このコマンドは、プログラムの実行を中断し、「デバッガーコンソール」パースペクティブを開いて次を入力することにより、Eclipse/CDTデバッグで実行できます。set scheduler-locking onスケジューラーロックをオフに設定

scheduler-lockingおよびnon-stopモードの詳細については、GDBのドキュメントを参照してください。糸。

176
Erik Kaju

エリック・カジュの答えに加えて。 CDTをデバッグしている場合(これはJavaにも当てはまるかもしれませんが、それについてはわかりません)

  1. Run()メソッド(またはそれに相当するもの)にブレークポイントを置きます。または、必要なスレッドと不要なスレッド(フィルターによって削除されるスレッド)の両方が実行されていると確信できる任意のポイント。
  2. デバッグセッションを開始します。
  3. 実行中のブレークポイントに到達すると、別のブレークポイントに移動し、無効になっている場合は有効にすることができます。次に、ブレークポイントを右クリックし、[フィルター]に移動して、ブレークポイントを有効にしておくスレッドを選択し、残りのスレッドのチェックを外します。したがって、このブレークポイントはその特定のスレッドに対してのみヒットします。

欠点は、この手順をデバッグセッションごとに繰り返す必要があることです。誰かがショートカットを提供できるなら、それはいいでしょう。

4
GauravKadyan

eclipseデバッグウィンドウで、スレッドをジャンプして目的のワーカースレッド番号に到達し、ステップオーバー(F6)の順次探索を続行できます。 enter image description here

2
Jules Martel