我想对在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程序......轻轻包装。有没有办法调试它?
答案 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进程。