Java远程调试 - 如何让调试器保持监听?

时间:2017-11-28 10:57:25

标签: java debugging intellij-idea remote-debugging

我使用IntelliJ IDEA远程调试Java CLI程序,调试器监听连接。

这适用于第一次调用,但调试器在CLI程序断开连接后停止侦听。我希望调试器继续监听,因为将进行多次CLI调用(按顺序,而不是并行),并且只有其中一个会触发我设置的断点。

这是我的客户端调试配置:

-agentlib:jdwp=transport=dt_socket,server=n,address=5005,suspend=y

是否可以让调试器保持监听?

5 个答案:

答案 0 :(得分:2)

因为CLI程序终止,调试器也会停止。如果您仍想继续多次运行CLI程序的调试器会话,那么您可以尝试如下,

编写一个包装程序,从中多次调用CLI程序并调试包装程序而不是CLI程序。

像这样,

public class Wrapper {
    public static void main(String[] args) {
        YourCLIProgram yp = new YourCLIProgram();
        // First Invocation
        String[] arg1 = { }; // Arguments required for your CLI program
        yp.main(arg1);
        // Second Invocation
        String[] arg2 = { }; // Arguments required for your CLI program
        yp.main(arg2);
        // Third Invocation
        String[] arg3 = { }; // Arguments required for your CLI program
        yp.main(arg3);
        // Fourth Invocation
        String[] arg4 = { }; // Arguments required for your CLI program
        yp.main(arg4);

    }
}

我希望它有效。

答案 1 :(得分:1)

这也取决于你想要实现的目标。 如果要检查传递给CLI的参数,只需将它们记录到文件中,或者在DB(或文件)中保存所需的任何信息。

答案 2 :(得分:0)

JPDA中,按规范transport service可以支持或不支持多个连接。 例如,在Eclipse中doesn't。我想IDEA一样。

答案 3 :(得分:0)

设置运行配置时,您是否选择了&#34; Listen&#34;调试器模式?您显示的命令行参数看起来像普通&#34;附加&#34;设置,而#34; Listen&#34;看起来像这样: -agentlib:jdwp=transport=dt_socket,server=n,address=yourhost.yourdomain:5005, suspend=y,onthrow=<FQ exception class name>,onuncaught=<y/n>(具体来说,您的参数缺少应用程序的地址 - 您的CLI程序 - 在启动时连接到IDEA。)

我读了一篇帖子,暗示了&#34; onthrow&#34;一般调试可能不需要参数,但我自己没有尝试过。

答案 4 :(得分:0)

尝试使用suspend = n:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

在我的本地应用程序(tomcat网络应用程序)上,即使我在JDK8上运行,我仍然使用较旧的方式来做它并且它工作正常(你可以尝试另一件事):

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005