通常要将debuger附加到正在运行的jvm,您需要使用如下参数启动jvm:
> java -Xdebug -Xrunjdwp:transport=dt_socket,address=1000,server=y,suspend=n
现在,如果我想调试未在调试模式下启动的进程,我该怎么办?
当生产系统(即没有调试args启动)表现出“随机”(我使用松散术语)错误时,就会出现这种情况。所以我不能用适当的参数重启jvm,因为没有人知道如何再次重现bug。在这种情况下是否无法连接到JVM?
只是为了澄清它不可能使用像jdb这样的工具连接到已经运行的JVM,除非它们是以调试模式启动的
使用jdb的另一种方法是将其附加到Java VM 已经运行。要成为的VM 用jdb调试必须以。开头 以下选项:
答案 0 :(得分:45)
您可以使用jsadebugd(JDK)将调试服务器附加到进程(在具有Debugging Tools for Windows的Windows上可用)。它被标记为实验性的,因此您可能希望首先在测试机上试用它。
用法:
jsadebugd <pid>
jdb -connect sun.jvm.hotspot.jdi.SADebugServerAttachingConnector:debugServerName=localhost
可以使用jdb -listconnectors
找到带arg的连接器名称。
答案 1 :(得分:28)
只是为了澄清不可能使用像jdb这样的工具来附加已经运行的JVM&gt; &GT;除非它们以调试模式启动
在苏联俄罗斯来源中读你
jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=9426
答案 2 :(得分:7)
VisualVM不是调试器,但您可以从中获取线程转储和堆转储,这对于诊断某些问题非常有用。最有用的功能需要JVM 5或6。
答案 3 :(得分:5)
使用jstack(在死锁的情况下很有用)或btrace VisualVM插件也可以做到这一点
答案 4 :(得分:-5)
您可以随时使用jdb和debug:P