如何将调试器附加到使用Commons Daemon Service Runner运行的Java程序?

时间:2017-06-16 13:56:17

标签: java debugging apache-commons jdb

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

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

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

目标流程不会像java -jar foo.jar那样运行,也不会像这样正常运行。它是包装java代码的特定于应用程序的EXE文件。它在一个流程列表中标识为" Commons Daemon Service Runner"看着里面的字符串,似乎是the prunsrv program from Apache Commons Daemon

Process Explorer告诉我没有命令行参数,并且该进程是services.exe的子进程。我有能力从Windows服务启动和停止它,但我不知道如何用它做任何其他事情。

jps命令没有显示此过程,但我知道它是一个Java程序......轻轻包装。有没有办法调试它?

1 个答案:

答案 0 :(得分:1)

尝试将_JAVA_OPTIONS变量设置为以下内容:

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

JVM启动时应该拾取此变量。

然后,您可以尝试通过调用

来附加到此JVM

jdb -attach 32887

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

<强>更新

您可以使用不同的连接方式。由你决定。我给你的只是许多不同的设置方式的一个例子。请查看此处了解更多详情:

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

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