调试 Java 应用程序,而无需使用调试参数启动 JVM

2022-08-31 10:23:10

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

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

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

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

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

从 JVM 手册页

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


答案 1

您可以使用 jsadebugdJDK) 将调试服务器附加到进程(在 Windows 上,Windows 上可使用 Windows 调试工具)。它被标记为实验性,因此您可能需要先在测试计算机上试用它。

用法:

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

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


答案 2

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

在苏维埃俄罗斯来源阅读你

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