如何在intellij中进行步骤调试时保持当前线程

时间:2015-06-27 08:58:07

标签: java multithreading debugging intellij-idea intellij-14

在intellij中调试多线程代码时,更具体地说是在线程内部进行调试...

设定:

            @Override
            public
            void run() {
                while (true) {
                  System.err.println("1" + get());  <-- breakpoint
                  System.err.println("2" + get());
                  System.err.println("3" + get());
                }
            }

            public String get() {
               return "x";
            }

我有6个线程,都运行上面的代码。

Intellij不断更改我当前的主题,这意味着当我发出&#34; Step over&#34; (F8)命令为T1,调试器将焦点改为T2。我期待的是留在T1 我正在调试 - 所以要产生结果:

T1: 1x
T1: 2x
T1: 3x
T1: 1x
T1: 2x

然后,让我们切换到另一个线程T2。

T2: 1x
T2: 2x
T2: 3x
T2: 1x
T2: 2x
T2: 3x

然后,回到T1:

T1: 3x  (it picks back up from where it left off)

相反,我得到的是:

T1: 1x
T3: 1x
T5: 1x
T1: 2x
T2: 1x
T3: 2x
T1: 3x
etc.

它是无序的,根本不是直观。

如果我想达到预期的行为,我必须执行以下操作:

切换到T1:

T1: 1x

切换到T1:

T1: 2x

切换到T1:

T1: 3x

切换到T2:

T2: 1x

切换到T2:

T2: 2x

切换到T2:

T2: 3x

切换到T1:

T1: 1x

等...

我已经找到了防止这种情况的方法,而且我找不到解决方案,而且我发现的唯一方法(保持踩在我当前的线程中)是每次我走的时候都要用鼠标选择它。

问题是:如何防止intellij更改我所在的主题?

编辑:我应该指出,如果调用任何方法,线程执行顺序是无序的。

3 个答案:

答案 0 :(得分:2)

事实上,IDEA 15(http://blog.jetbrains.com/idea/2015/06/intellij-idea-15-eap-is-open/)已经解决了这个问题。

此外,当在另一个线程中达到断点时,会有一个通知 - 我发现它很不错。

答案 1 :(得分:0)

通过右键单击断点点,您可以选择一些选项,例如Suspend on Thread。

enter image description here

答案 2 :(得分:0)

从Intellij IDEA 16开始,通过仅恢复临时线程,围绕此问题出现了新的变化,并且可以通过in the latest IDEA 16 EAP

enabling "debugger.step.resumes.one.thread" property in IDEA vmoptions进行测试