通常,要将调试器附加到正在运行的jvm,您需要使用以下参数启动jvm:
> java -Xdebug -Xrunjdwp:transport=dt_socket,address=1000,server=y,suspend=n
现在,如果我要调试不是在调试模式下启动的进程,该怎么办?
当生产系统(即在没有调试args的情况下启动)显示“随机”(我用宽松的术语)错误时,就会出现这种情况。因此,我无法使用适当的参数重新启动jvm,因为没人知道如何再次再现该错误。在这种情况下是否不可能附加到JVM?
只是为了澄清,除非将它们以调试方式启动,否则无法使用jdb之类的工具将其附加到已经运行的JVM中
从JVM手册页
使用jdb的另一种方法是将其附加到已经运行的Java VM。使用jdb调试的VM必须使用以下选项启动:
你可能可以使用jsadebugd(JDK)将调试服务器附加到进程(在Windows上可通过Windows的调试工具获得)。它被标记为实验性的,因此你可能需要首先在测试机上进行尝试。
用法:
jsadebugd <pid> jdb -connect sun.jvm.hotspot.jdi.SADebugServerAttachingConnector:debugServerName=localhost
可以使用找到带有arg的连接器名称jdb -listconnectors。
jdb -listconnectors