在 intellij 中进行单步调试时如何保持在当前线程上
How to stay on the current thread while step-debugging in intellij
在 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 不断更改我所在的当前线程,这意味着当我为 T1 发出 "Step over" (F8) 命令时,调试器会将焦点更改为 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 更改我所在的线程?
编辑:我应该指出,如果调用任何方法,线程执行顺序是乱序的。
在断点处右击,可以选择一些选项,例如Suspend on Thread。
确实,IDEA 15 (http://blog.jetbrains.com/idea/2015/06/intellij-idea-15-eap-is-open/) 已经解决了这个问题。
此外,当在另一个线程中到达断点时,会有一个通知 - 我觉得这很不错。
从 Intellij IDEA 16 开始,通过仅恢复当前线程来解决此问题,并且可以对其进行测试in the latest IDEA 16 EAP by enabling "debugger.step.resumes.one.thread" property in IDEA vmoptions
在 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 不断更改我所在的当前线程,这意味着当我为 T1 发出 "Step over" (F8) 命令时,调试器会将焦点更改为 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 更改我所在的线程?
编辑:我应该指出,如果调用任何方法,线程执行顺序是乱序的。
在断点处右击,可以选择一些选项,例如Suspend on Thread。
确实,IDEA 15 (http://blog.jetbrains.com/idea/2015/06/intellij-idea-15-eap-is-open/) 已经解决了这个问题。
此外,当在另一个线程中到达断点时,会有一个通知 - 我觉得这很不错。
从 Intellij IDEA 16 开始,通过仅恢复当前线程来解决此问题,并且可以对其进行测试in the latest IDEA 16 EAP by enabling "debugger.step.resumes.one.thread" property in IDEA vmoptions