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



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

我尝试的第一件事是jdb -attach 5312.此操作失败,并显示"shmemBase_attach失败:系统找不到指定的文件"。我发现了一些有关该错误消息的相关问题,但他们似乎在谈论涉及不同主机上的调试器和目标的更复杂的方案。

我正在做的是本地流程附加,所以我认为它应该更容易。但是有一些东西使它更加困难。

目标进程不会像java -jar foo.jar运行或类似正常运行。它是一个特定于应用程序的 EXE 文件,包装了 java 代码。它在进程列表中将自己标识为"Commons Daemon Service Runner",并查看其中的字符串,它似乎是来自Apache Commons Daemon的prunsrv程序。

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

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

尝试将变量设置为如下所示_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。在这种情况下,您需要让 JVM 进程对运行 VisualVM 的用户可见。

相关内容

  • 没有找到相关文章

最新更新