IntelliJ线程调试

时间:2012-09-25 10:29:35

标签: java debugging ide intellij-idea

IntelliJ IDEA是否提供线程调试?也就是说 - Netbeans允许您调试多个线程,并在这些断点处自动停止(自动)。然而,我似乎进入IntelliJ的所有内容都是“线程转储”,这似乎是一个手动分析,当我点击'Thread Dump'时拍摄的快照。

有什么我想念的吗? 我已经谷歌了,没有找到足够的信息来协助。

5 个答案:

答案 0 :(得分:25)

我想你可以。我通过设置suspend policy通过断点暂停了线程。这将暂停执行此代码的线程。如果你有多个线程,那么我认为它们会继续。

引用暂停政策

  • 项目说明
  • 全部:当命中断点时,所有线程都被挂起
  • 线程:当命中断点时,挂起断点的线程被挂起。
  • 无:没有线程被暂停。

答案 1 :(得分:6)

您有一个很好的Threads视图。

按下小齿轮,您将看到所有活动的螺纹。

enter image description here

在每个断点上,您可以设置暂停策略。您可以将Thread替代值作为所有断点的默认值,也可以在每个断点上单独设置它们。

enter image description here

答案 2 :(得分:3)

对我来说,没有访问线程的问题仍然存在。我为所有人设置制动点。并将制动点放在调用方法中。我注意到,当我调用run()而不是start()时,新线程中的方法被访问。只是想知道为什么,AFAIK的start()方法应该调用run()。然而,即使我调用.start(),也会发生线程输出,但从不访问它。

答案 3 :(得分:0)

对我来说,问题是在断点之后恢复线程并在IntelliJ中评估断点似乎存在竞争条件。

我的短期工作是在我产生线程之前没有设置断点。如果我不这样做,则会错过 run() call()中的前几个断点。

答案 4 :(得分:0)

我认为你遇到的问题是子线程比你预期的更早关闭,因为主线程(测试本身)到达终点。

请记住,当您执行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可能就是你想要的。

希望它可以帮助某人!