web-dev-qa-db-ja.com

IntelliJスレッドデバッグ

IntelliJ IDEAはスレッドデバッグを提供しますか?つまり、Netbeansを使用すると、複数のスレッドをデバッグし、それらのブレークポイントで(自動的に)停止できます。ただし、IntelliJで取得しているのは「スレッドダンプ」だけです。 "、これは手動の分析のようで、[スレッドダンプ]をクリックしたときに取得したスナップショットです。

足りないものはありますか?私はグーグルで検索しましたが、支援するのに十分な情報が見つかりませんでした。

19
Dane Balia

できると思います。 suspend policy を設定して、ブレークポイントを介してスレッドを一時停止しました。これにより、このコードを実行しているスレッドが一時停止されます。あなたが複数のスレッドを持っているなら、私はそれらが続くと思います。

一時停止ポリシーを引用するには

  • アイテム説明
  • すべて:ブレークポイントに到達すると、すべてのスレッドが中断されます
  • スレッド:ブレークポイントにヒットすると、ブレークポイントにヒットしたスレッドが中断されます。
  • なし:中断されているスレッドはありません。
26
RNJ

素敵なThreadsビューが利用可能です。

小さな歯車を押すと、すべてのアクティブなスレッドが表示されます。

enter image description here

また、各ブレークポイントでサスペンドポリシーを設定できます。 Thread代替をすべてのブレークポイントのデフォルトにするか、各ブレークポイントに個別に設定することができます。

enter image description here

6
maba

私にとって、スレッドにアクセスしないという問題はまだ発生しています。私はすべてにブレーキポイントを設定しました。そして、呼び出しメソッド内にブレーキポイントを配置します。私が気付いたのは、run()を呼び出したときに、start()ではなく、新しいスレッドのメソッドにアクセスしていることです。なぜだろうと思っているのですが、start()メソッドはrun()を呼び出す必要があります。それでも、.start()を呼び出してもスレッドからの出力は発生しますが、アクセスすることはありません。

3
Jacob

あなたが抱えている問題は、メインスレッド(テスト自体)が最後に到達したために、子スレッドが予想よりも早く閉じられていることだと思います。

Thread.start()を実行すると、非同期呼び出しが開始されます。Junitを使用してテストを実行している場合、実行はこの呼び出しの後、テストが終了するまで続行され、最後に到達するとすぐに実行されます。その中で開始したスレッドをシャットダウンします。

したがって、次のようなものがある場合:

01. import org.junit.Assert;
02. import org.junit.Test;
03. public class ThreadTest {
04.     static boolean didIGetIt = false;
05.     @Test
06.     public void testThread() {
07.         Thread myThread = new Thread(new Runnable() {
08.             @Override
09.             public void run() {
10.                 System.out.println("I am an asynchronous task");
11.                 System.out.println("and JUnit won't wait for me to finish my job!");
12.                 didIGetIt = true;
13.             }
14.         });
15.         myThread.start();
16.         Assert.assertTrue(didIGetIt);
17.     }
18. }

Run()内のコードが失敗テストにつながる前にAssertを実行します。

ただし、単純なスリープを追加すると、メインスレッドを停止してデバッグし、メインスレッドが停止する前に必要なことを実行できます。

01. import org.junit.Assert;
02. import org.junit.Test;
03. public class ThreadTest {
04.     static boolean didIGetIt = false;
05.     @Test
06.     public void testThread() throws InterruptedException {
07.         Thread myThread = new Thread(new Runnable() {
08.             @Override
09.             public void run() {
10.                 System.out.println("I am an asynchronous task");
11.                 System.out.println("and JUnit won't wait for me to finish my job!");
12.                 didIGetIt = true;
13.             }
14.         });
15.         myThread.start();
16.         System.out.println("Let's wait for child threads to finish");
17.         Thread.sleep(5000);
18.         Assert.assertTrue(didIGetIt);
19.     }
20. }

確かにそれを行うためのより良い方法がありますが、Thread.sleepはあなたが探しているものかもしれません。

それが誰かを助けるかもしれないことを願っています!

0
Marco Vargas

私にとっての問題は、IntelliJでブレークポイントの後にスレッドを再開し、ブレークポイントを評価する競合状態があるように見えることでした。

私の短期的な回避策は、スレッドを生成する直前にブレークポイントを設定しないことでした。これを行わないと、run()またはcall()の最初のいくつかのブレークポイントが失われます。

0
kervin