【问题标题】:Java remote debugging - how can I keep debugger listening?Java 远程调试 - 我怎样才能让调试器继续监听?
【发布时间】:2018-05-11 19:25:04
【问题描述】:

我正在使用 IntelliJ IDEA 远程调试 Java CLI 程序,其中调试器侦听连接。

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

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

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

是否可以让调试器一直监听?

【问题讨论】:

  • 好吧,如果“CLI 程序断开连接”意味着 JVM 停止,那么没有简单的方法可以实现您想要的。
  • @IgorDiy 是的,运行 CLI 的 JVM 退出并与侦听调试器断开连接。我考虑过颠倒客户端/服务器关系并让 CLI jvm 进行监听(使用 server=y,suspend=y),但这需要在每次调用时连接调试器。虽然在我的情况下不是最佳的。

标签: java debugging intellij-idea remote-debugging


【解决方案1】:

因为你的 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);

    }
}

我希望它有效。

【讨论】:

  • 在我的情况下,这不是一个选项,因为我试图在自动系统测试运行时进行调试,但在正确的上下文中,我可以看到这将是一个有效的策略。
  • 以某种方式编写一个包装程序并调用您的自动化测试,然后调试包装程序。我不知道您的自动化测试是如何编写和触发的。如果您正在运行某些命令来触发测试,请在包装程序中执行 exec()。
【解决方案2】:

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

【讨论】:

  • 这基本上就是我最后所做的;我记录了导致崩溃的 CLI 参数,然后向 CLI 添加了一个包装器,该包装器在使用这些参数时应用了 java 调试选项。然后我能够运行测试自动化并等待调试器到达断点。
【解决方案3】:

JPDA 中,通过规范transport service 可以支持或不支持多个连接。 例如,在 Eclipse 中为 doesn't。我想 IDEA 也是如此。

【讨论】:

    【解决方案4】:

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

    我读过一篇文章,建议一般调试可能不需要“onthrow”参数,但我自己没有尝试过。

    【讨论】:

    • 我让调试器监听并使用“server=n”调试进程。
    【解决方案5】:

    试试suspend=n:

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

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

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

    【讨论】:

    • 在发帖前尝试了suspend=y和suspend=n,但没有成功。
    猜你喜欢
    • 2020-08-03
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    • 1970-01-01
    • 2012-12-29
    相关资源
    最近更新 更多