为什么Intellij IDEA不立即终止调试进程?

13
我是一名有用的助手,可以为您翻译文本。

我正在使用 Idea 2016.1.1 ,想知道为什么在单击停止按钮后,Idea不能立即终止调试进程。

例如,使用以下代码片段进行复制:

public class Main {

  public static void main(String[] args) {
    int i = 0;
    while (true) {
      i++;
      System.out.print("I'm still alive: ");
      System.out.println(i);
    }
  }
}

在循环开始之前设置断点。

enter image description here

开始调试会话,等待程序停在断点处,然后按下红色的停止按钮(CTRL-F2)。

enter image description here

我期望这个程序会立即停止,不输出任何东西,但实际上它会输出:
"C:\Program Files\Java\jdk1.6.0_38\bin\java" ....
Connected to the target VM, address: '127.0.0.1:54394', transport: 'socket'
Disconnected from the target VM, address: '127.0.0.1:54394', transport: 'socket'
I'm still alive: 1
I'm still alive: 2
I'm still alive: 3
I'm still alive: 4
...
I'm still alive: 319
I'm still alive: 320
I'm still alive: 321
I'm still alive: 
Process finished with exit code -1

为什么进程不能立即停止?

是否有其他方法可以强制立即停止?

编辑

刚试过了 idea 14.1.5。进程会立即停止,如预期。看来这个问题是在2016年引入的一个bug。

3个回答

9

在调试会话期间按下 停止 按钮时,
IntelliJ IDEA 的默认行为不是立即终止该进程!

但是如果您需要更改此行为以立即终止调试过程,
我认为这应该是默认行为:)

您可以通过设置来激活它:
设置 > 构建、执行、开发 > 调试器 >

enter image description here


这在我的Mac OS 10.15.7上的2020.3版本开始发生。这个设置没有任何影响。 - Sean Anderson
1
这应该是被接受的答案。此功能在2020.3版本中可用。 同意默认行为应该被翻转,因为不立即终止进程似乎不直观,并且可能会导致各种不良副作用。 - Brett Hannah
1
在我看来,这不应该是一个配置项;我们应该有两个不同的按钮,如停止调试会话(应立即终止进程)和从调试器分离(将继续进程)。因此,选择可以在调试时进行。 - Ricardo

4

迄今为止,我的调查显示...

当IDEA启动Java进程时,它使用主包装器。该包装器启动一个守护线程,监听ServerSocket以接收命令。

IDEA向该服务器套接字发送STOP信号。当服务器线程接收到STOP信号时,它使用System.exit(1)退出jvm。

似乎IDEA从调试中恢复JVM,然后发送STOP信号。因此,在接收到STOP信号之前,进程会继续运行。

我在https://youtrack.jetbrains.com/issue/IDEA-155007上提交了一个错误报告。


如果人们想很快修复这个 bug,就应该在 YouTrack 上投票。 - goat

4

问题 IDEA-155007 已在 2016.3 (163.7743.44) 版本中解决。我刚刚验证过了。


最新版本仍然发生在我的电脑上。编辑:算了,这里提到了一个设置:https://intellij-support.jetbrains.com/hc/en-us/community/posts/360000112384-Intellij-IDEA-doesn-t-stop-test - b15

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接