使用IntelliJ IDEA调试关闭代码?

3

我注意到 IntelliJ 的调试器出现了一些意外和不良的行为,想知道是否有人了解这方面的情况。

我们的 Spring 应用程序具有相当复杂的关闭逻辑。我们利用 Spring 的“可处理 Bean”接口,并且还注册了自己的 JVM 关闭挂钩。我经常发现自己想在此代码中停止调试器。我希望能够通过按下 IntelliJ 调试器的停止按钮并使我的断点被命中来实现这一点。这是我预期的行为。

当我在 IntelliJ 调试器中按下停止按钮时,我的关闭代码中的断点没有被命中。起初,我认为可能是 IntelliJ 强制终止了我的应用程序,而不是向进程发送终止信号(我相信它会发送 SIGINT)。但是,我已经确认当我按下停止按钮时,我的关闭代码确实运行了。这种行为就像 IntelliJ 在向我的应用程序发送 SIGINT 信号之前注销了我的断点。

我的解决方法是从 shell 提示符中向我的应用程序发送 SIGINT。当我这样做时,我的断点被命中了。这很麻烦。因此,我想知道是否有人有办法在按下停止按钮时使断点被命中,或者至少了解调试器为什么会出现这种行为。


1
作为另一个可能的猜测:IntelliJ 可能会在关闭钩子或类似的情况下自行分离。换句话说,问题可能不在于如何结束应用程序,而是在于 IntelliJ 如何处理正在运行的实例的结束。 - Rogue
1个回答

3
正如@Rogue所猜测的那样,当您点击停止按钮时,IDEA会断开调试器并向应用程序发送SIGINT信号。目前没有设置来配置此行为。有关详细信息,请查看此处的相关问题:https://youtrack.jetbrains.com/issue/IDEA-170313/Breakpoints-not-working-after-stop-signal
作为解决方法,您可以打开“设置|工具|外部工具”,添加一个脚本,该脚本可以找到您的Java进程并发送SIGINT信号。然后,分配一个快捷键或在IDEA的工具栏中添加一个菜单,“设置|外观和行为|菜单和工具栏”,这样您就可以像使用停止按钮一样轻松使用它。

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