2013-03-08 86 views
7

我想如下运行具有断点下面的代码:的IntelliJ - 没有停止对多线程代码中的所有断点

new Thread(new Runnable() { 
     @Override 
     public void run() { 
      System.out.println("Starting"); //breakpoint here 
     } 
    }).start(); 

    int i = 10; 
    i++; //breakpoint here 

运行此代码时只有I ++断点被击中......如果我删除那一个,另一个线程的断点将被正确命中。为什么这种奇怪的行为发生?

回答

6

这是记录在http://www.jetbrains.com/idea/webhelp/breakpoints-2.html

有某些情况时的IntelliJ IDEA不会在断点处停止。考虑以下情况: 在一个类的不同方法中设置了两个断点,并将暂挂策略设置为全部。 当其中一个断点被击中时,会执行一些步骤操作。 如果在步进另一个线程时遇到第二个断点,IntelliJ IDEA不会停在那里。

我复制了您的代码示例并重新创建了情况。 果然,就像它在文档中说的那样,在停止在i++断点处后,如果我按F8(跳过),程序不会停在另一个断点上。但是如果我打F9(恢复)程序确实再次停在另一个断点上。

+0

我个人认为这是一个竞赛条件。在我的情况*恢复*仍然**没有**触发新线程的断点。解决问题的唯一方法是在开始新线程之前不要分手。然后这一切正常。 – kervin 2015-07-30 01:45:44

+0

是否将断点上的暂停策略设置为“全部”(而不是“线索”)? – 2015-07-30 11:33:03

+0

是的,他们都是。我可以简单地通过将断点从线程起点移近或更远来触发该问题,以便单独确认某种竞争条件。 – kervin 2015-07-30 12:34:27

0

因为另一个线程是计划的要在后台运行,并且当OS线程调度程序决定运行它时,它将运行。当你有一个断点时,它会被击中。

当你只是运行代码时,它不会一定开始,因此立即命中i++处的断点。

+0

断点从未被击中...主线程完成执行,我可以看到打印的“Starting”字符串,所以行已经执行,但没有发生断点 – Bober02 2013-03-08 16:50:18

+0

@ Bober02也许你的调试器不会执行多线程调试? – 2013-03-08 16:52:25

0

我刚刚遇到了这个问题,并且为了其他人遇到这个问题,下面是此行为的原因以及如何更改它。

正如Doron指出的,有关于此的文件。但是,要注意的是,默认情况下,当达到断点时,JVM中的所有线程都会挂起。

你所期望的(以及我期望的)是只有带断点的线程被挂起。

这不是你想要的,也不是我想要的。

改变这种行为(并提供所需的行为)。

1)通过左键单击边距创建断点。
2)按ctrl + shift + F8(调出断点菜单)。
3)选择你的断点。你会看到它的选项。
4)确保选中了“Suspend”并选择了“Thread”无线电选项。
5)单击“设为默认值”按钮。

现在,当您运行时,您会看到不同线程中的断点被击中。