100

通常要将调试器附加到正在运行的 jvm,您需要使用以下参数启动 jvm:

> java -Xdebug -Xrunjdwp:transport=dt_socket,address=1000,server=y,suspend=n

现在如果我想调试一个没有在调试模式下启动的进程,我该怎么办?

当生产系统(即在没有调试参数的情况下启动)出现“随机”(我松散地使用该术语)错误时,就会出现这种情况。所以我无法使用适当的参数重新启动 jvm,因为没有人知道如何再次重现该错误。在这种情况下是否无法附加到JVM?

只是为了澄清不可能使用像 jdb 这样的工具来附加到已经运行的 JVM,除非它们是在调试模式下启动的

来自 JVM 手册页

使用 jdb 的另一种方法是将它附加到已经运行的 Java VM。要使用 jdb 调试的 VM 必须使用以下选项启动:

4

5 回答 5

50

您可以使用jsadebugd ( JDK ) 将调试服务器附加到进程(在 Windows 上可通过Debugging Tools for Windows 获得)。它被标记为实验性的,因此您可能想先在测试机器上试用它。

用法:

jsadebugd <pid>
jdb -connect sun.jvm.hotspot.jdi.SADebugServerAttachingConnector:debugServerName=localhost

可以使用 找到带有 arg 的连接器名称jdb -listconnectors

于 2008-12-17T22:27:09.000 回答
33

只是为了澄清不可能使用像 jdb 这样的工具来附加到已经运行的 JVM > > 除非它们是在调试模式下启动的

在苏联俄罗斯源读你

jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=9426
于 2010-06-10T14:52:33.843 回答
7

VisualVM不是调试器,但您可以从中获取线程转储和堆转储,这对于诊断某些问题很有用。最有用的功能需要 JVM 5 或 6。

于 2008-12-17T22:51:13.570 回答
6

使用 jstack(在死锁的情况下很有用)或btrace VisualVM 插件也可以解决问题

于 2009-10-08T01:07:33.133 回答
-5

您始终可以手动使用 jdb 和调试:P

于 2008-12-17T22:29:40.790 回答