Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java远程调试-如何保持调试器侦听?_Java_Debugging_Intellij Idea_Remote Debugging - Fatal编程技术网

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

Java远程调试-如何保持调试器侦听?,java,debugging,intellij-idea,remote-debugging,Java,Debugging,Intellij Idea,Remote Debugging,我使用IntelliJ IDEA远程调试Java CLI程序,调试器监听连接 这在第一次调用时可以正常工作,但在CLI程序断开连接后,调试器将停止侦听。我希望调试器保持侦听,因为将进行多个CLI调用(顺序调用,而不是并行调用),并且其中只有一个将触发我设置的断点 以下是我的客户端调试配置: -agentlib:jdwp=transport=dt_socket,server=n,address=5005,suspend=y 是否可以保持调试器侦听?中的“按规范”可能支持或不支持多个连接。 例如,

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

这在第一次调用时可以正常工作,但在CLI程序断开连接后,调试器将停止侦听。我希望调试器保持侦听,因为将进行多个CLI调用(顺序调用,而不是并行调用),并且其中只有一个将触发我设置的断点

以下是我的客户端调试配置:

-agentlib:jdwp=transport=dt_socket,server=n,address=5005,suspend=y
是否可以保持调试器侦听?

中的“按规范”可能支持或不支持多个连接。
例如,在Eclipse中。我想IDEA也是这样。

既然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);

    }
}

我希望它能工作。

在设置运行配置时,您是否选择了“侦听”调试器模式?显示的命令行参数与正常的“附加”设置类似,而“侦听”的参数如下所示:
-agentlib:jdwp=transport=dt\u socket,server=n,address=yourhost。yourdomain:5005,suspend=y,onthrow=,onuncught=
(具体地说,您的参数缺少应用程序的地址—您的CLI程序—在启动时连接到IDEA。)


我读过一篇文章,其中指出“Ontrow”参数对于一般调试可能不是必需的,但我自己还没有尝试过。

这还取决于您试图实现的目标。 如果要检查传递给CLI的参数,只需将其记录到文件中,或将所需的任何信息保存在DB(或文件)中即可。

尝试使用suspend=n:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
在我的本地应用程序(tomcat web app)上,即使我在JDK8上运行,我仍然使用较旧的方法,并且运行良好(另一件事您可以尝试):


好的,如果“CLI程序断开连接”意味着JVM停止,那么就没有简单的方法来实现您想要的。@iOrdiy是的,运行CLI的JVM退出并断开与侦听调试器的连接。我曾考虑过扭转客户机/服务器关系,让CLI jvm进行侦听(server=y,suspend=y),但这需要在每次调用时连接调试器。在我的情况下,这不是一个最佳选择。在我的情况下,这不是一个选项,因为我正在尝试在自动系统测试运行时进行调试,但在正确的上下文中,我可以看出这将是一个有效的策略。以某种方式编写一个包装程序,调用您的自动测试,然后调试包装程序。我不知道你的自动测试是如何编写和触发的。如果您正在运行一些命令来触发测试,那么在包装程序中执行exec()。我让调试器侦听,并使用“server=n”调试进程。在发布之前尝试了suspend=y和suspend=n,但没有成功。这基本上就是我最后所做的;我记录了导致崩溃的CLI参数,然后向CLI添加了一个包装器,在使用这些参数时应用java调试选项。然后,我可以运行测试自动化并等待调试器到达断点。
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005