【问题标题】:How do I attach a debugger to a Java program running with Commons Daemon Service Runner?如何将调试器附加到使用 Commons Daemon Service Runner 运行的 Java 程序?
【发布时间】:2017-11-19 08:10:54
【问题描述】:

我想对在 Windows 上运行的 Java 程序进行一些调试:回溯、打印一些变量、设置断点、单步执行关键函数。

我尝试的第一件事是jdb -attach 5312。这失败了“shmemBase_attach failed:系统找不到指定的文件”。我发现了一些关于该错误消息的relatedquestions,但他们似乎在谈论一个更复杂的场景,涉及到不同主机上的调试器和目标。

我正在做的是本地进程附加,所以我认为它应该更容易。但是有些事情让它变得更难了。

目标进程没有以java -jar foo.jar 或类似的正常方式运行。它是一个特定于应用程序的 EXE 文件,包含 java 代码。它在一个进程列表中将自己标识为“Commons Daemon Service Runner”,并查看其中的字符串,它似乎是the prunsrv program from Apache Commons Daemon

Process Explorer 告诉我没有命令行参数,并且该进程是 services.exe 的子进程。我可以从 Windows 服务启动和停止它,但我不知道如何使用它。

jps 命令没有显示这个过程,但我知道它是一个 Java 程序......轻轻包装。有什么方法可以调试吗?

【问题讨论】:

    标签: java debugging apache-commons jdb


    【解决方案1】:

    尝试将 _JAVA_OPTIONS 变量设置为这样的:

    _JAVA_OPTIONS "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=32887"

    这个变量应该在JVM启动时被JVM拾取。

    然后,你可以尝试通过调用附加到这个JVM

    jdb -attach 32887

    其中 32887 是调试器使用的任意端口号(数字必须匹配)。

    更新:

    您可以使用不同的连接方式。由你决定。我给你的只是许多不同的设置方式的一个例子。在这里查看更多详细信息:

    https://docs.oracle.com/javase/8/docs/technotes/guides/jpda/conninv.html

    您也可以使用 VisualVM。在这种情况下,您需要让运行 VisualVM 的用户可以看到 JVM 进程。

    【讨论】:

    • 我必须改变程序的运行方式以使其可调试?而且我必须使用远程调试协议来调试本地进程?这对我来说似乎很奇怪,习惯于在 unix 上使用 gdb,我可以通过 PID 附加到任何进程,而不需要它的任何合作(如果我是所有者或 root)。我会试试看...
    • 它接受来自所有人的远程连接,no authentication whatsoever!那是不可用的。
    • 看了几个选项后,我找到了这个组合:jdb -connector com.sun.jdi.SocketListen:port=12345,然后使用prunmgr配置目标服务,并添加选项-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:12345,server=n,suspend=y。我认为让世界未经身份验证的访问权限以作为被调试者的身份附加到我的调试器比其他方式稍微不那么愚蠢。仍然惊讶于没有简单的PTRACE_ATTACH 风格的界面。
    • 如果被调试者正在侦听端口,jdb -attach 在 Windows 上不起作用。
    猜你喜欢
    • 2015-11-14
    • 1970-01-01
    • 2017-12-30
    • 2014-02-02
    • 2014-01-22
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2017-11-06
    相关资源
    最近更新 更多