【问题标题】:IntelliJ Thread DebugIntelliJ 线程调试
【发布时间】:2012-09-25 10:29:35
【问题描述】:

IntelliJ IDEA 是否提供线程调试?也就是说 - Netbeans 允许您调试多个线程,并在这些断点处停止(自动)。然而,我似乎在 IntelliJ 中得到的只是“线程转储”,这似乎是一种手动分析,以及当我单击“线程转储”时拍摄的快照。

我有什么遗漏吗? 我已经 google 了,但没有找到足够的信息来提供帮助。

【问题讨论】:

  • 不清楚您的问题是什么。您在线程中有断点,但 IntelliJ 并没有停在那里?
  • 是的 - 它根本不会停止。单独设置似乎很复杂。在 NetBeans 中,“断点”就是这样 - 一个断点。切换回“NetBeans”。谢谢你们的帮助。
  • @DaneBalia 您可以在 IntelliJ 中设置每个断点就是这样 - 一个断点。确保 Thread 策略是默认策略。
  • 嗯....好的,会试试的。如果你们确定,那么问题就出在我身上。会检查我的代码,我一定是在做一些愚蠢的事情。

标签: java debugging ide intellij-idea


【解决方案1】:

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

引用暂停政策

  • 物品说明
  • All : 当断点被命中时,所有线程都被挂起
  • 线程:当断点被命中时,断点所在的线程被挂起。
  • 无:没有线程被挂起。

【讨论】:

  • 谢谢 - 我确实改变了“暂停政策”,甚至将默认设置为“线程” - 但仍然没有暂停。然后我只生成了'一个'线程,(注释掉了第二个) - 仍然没有断点。当我进行线程转储时,我确实看到了一个错误 - 但我在那行之前有一个断点。这很奇怪。你有什么想法吗?
  • 你是如何构建/运行的?有时,当我部署我的代码时,部署的代码可能已经过时了。如果发生这种情况,那么我的断点会变得非常有趣......
  • 你说得对 - 它现在正在工作。进行了适当的构建,一切都很好。多谢你们。还使所有断点默认为“线程”
  • 问题的真正原因是我在设置挂起策略之前创建了一大堆断点,即使我将“默认”设置为线程,旧断点设置为“全部”。我不得不手动将它们重置为默认值。那行得通!就是这样!
【解决方案2】:

您有一个不错的Threads 视图可用。

按下小齿轮,您将看到所有活动线程。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 如果你调用 run() 方法同步运行,当你调用 start 方法运行时,异步运行,当方法异步运行时,由于某种原因线程不会在断点处停止
    【解决方案4】:

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

    我的短期工作是在生成线程之前不设置断点。如果我不这样做,run()call() 中的前几个断点就会丢失。

    【讨论】:

      【解决方案5】:

      我认为您遇到的问题是子线程比您预期的要早关闭,因为主线程(测试本身)到达了末尾。

      请记住,当您执行 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 可能是您正在寻找的。​​p>

      希望它可以帮助别人!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-05
        • 1970-01-01
        相关资源
        最近更新 更多