【问题标题】:How to stay on the current thread while step-debugging in intellij如何在 intellij 中进行单步调试时保持在当前线程上
【发布时间】:2015-06-27 08:58:07
【问题描述】:

在 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 发出“跳过”(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 更改我所在的线程?

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

【问题讨论】:

  • 虽然相关,但我对停止整个 VM 并在那时进行调试不感兴趣。我的问题是IDEA在调试过程中在线程之间跳过——我只是希望它在单步执行时保持在当前线程中。
  • 看起来这可能已在 3 周前的 EAP 15 中修复。

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


【解决方案1】:

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

【讨论】:

  • 我已经这样做了,它不会改变任何东西。我应该指出,如果我完全更改线程,它会再次出现问题(我会为此更新我的问题)
  • 您可以添加一个条件,这将检查您是否正在使用特定的线程。但它需要你在线程池中明确地命名线程。
  • 不完全是我想要的,因为这样可以确保断点仅对特定线程有效——我想单步执行所有线程,但不更改线程直到我这样指定。 (我更新了问题以提供更清晰的说明)
  • 你只想同步做一个代码?您必须知道维护执行顺序的规则与指定的 ThreadPoolExecutor 实现有关。与en.wikipedia.org/wiki/Preemption_(computing)有关
  • 是的,我知道这一点。如果我正在逐步调试单个线程(在许多线程中),我希望留在该线程中,直到我明确选择更改线程(或线程被挂起/死亡/等)。这就是 Eclipse 和 Netbeans 的运行方式。只要您没有遇到任何方法,Intellij 就会以这种方式工作。当 Intellij 在单步调试时遇到方法时,whoooooop - 是时候切换线程了!
【解决方案2】:

确实,IDEA 15 (http://blog.jetbrains.com/idea/2015/06/intellij-idea-15-eap-is-open/) 已修复此问题。

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

【讨论】:

    【解决方案3】:

    从 Intellij IDEA 16 开始,通过仅恢复当前线程来解决此问题,并且可以通过 enabling "debugger.step.resumes.one.thread" property in IDEA vmoptions 测试 in the latest IDEA 16 EAP

    【讨论】:

    • 哦,真是一个有趣的转折。
    猜你喜欢
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2013-07-13
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多