使用debugging参数debuggingJava应用程序而不启动JVM

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

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

现在,如果我想debugging一个在debugging模式下未启动的进程,我该怎么办?

当一个生产系统(即没有debugging参数的情况下启动)呈现出一个“随机”(我使用术语松散)错误时,这种情况就出现了。 所以我不能用适当的参数重新启动jvm,因为没有人知道如何重现错误。 在这种情况下,不能附加到JVM吗?

只是澄清它是不可能使用像jdb这样的工具附加到已经运行的JVM,除非它们是以debugging模式启动的

从JVM手册页

另一种使用jdb的方法是将其附加到已经运行的Java VM上。 要用jdbdebugging的虚拟机必须使用以下选项启动:

您可能能够使用jsadebugd ( JDK )将debugging服务器附加到进程(在Windows上使用Windows debugging工具提供 )。 它被标记为实验性的,所以你可能想先试一试。

用法:

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

连接器名称与arg可以使用jdb -listconnectorsfind。

只是澄清它是不可能使用像jdb这样的工具附加到已经运行的JVM上,除非它们是以debugging模式启动的

在苏联俄罗斯来源读你

 jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=9426 

VisualVM不是一个debugging器,但是你可以从中获得线程转储和堆转储,这可以用来诊断一些问题。 最有用的function需要JVM 5或6。

使用jstack(在死锁的情况下有用)或btrace VisualVM插件也可以做到这一点

你总是可以使用jdb和手工debugging:P