【问题标题】:Debug a java application without starting the JVM with debug arguments在不使用调试参数启动 JVM 的情况下调试 java 应用程序
【发布时间】:2010-09-27 10:23:53
【问题描述】:

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

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

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

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

澄清一下,除非它们是在调试模式下启动的,否则无法使用 jdb 之类的工具附加到已经运行的 JVM 上

来自 JVM 手册页

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

【问题讨论】:

标签: java debugging jvm jvm-arguments


【解决方案1】:

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

用法:

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

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

【讨论】:

  • 我正在使用 linux,所以这似乎是最有希望的解决方案
  • 有什么经验可以分享一下吗?
  • 我的经验是它在我需要的时候运行良好,同时所有出厂的软件实例都没有配置为默认使用 jvm 调试选项启动,因此我们可以使用支持的方法。
  • 在 Java 11 上,jsadebugdjhsdb debugd 取代。这样就变成了jhsdb debugd --pid &lt;pid&gt;。见slides of a talk presenting jhsdbthe docs for jhsdb
  • 似乎SADebugServerAttachingConnector 也从jdb 中删除了,我认为替换应该是jhsdb hsdb / jhsdb clhsdb。我找不到任何关于向jhsdb clhsdb 提供什么论据的文档。
【解决方案2】:

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

在苏联俄罗斯源读你

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

【讨论】:

  • 嗯,这是“支持”的答案,但实验性的答案是我接受的,所以它可以在不受支持的方式下完成
【解决方案3】:

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

【讨论】:

  • 链接不起作用....也许您在 https:// 之前删除了 http://...我会但还没有足够的声誉
  • +1 VisualVM 看起来非常有趣。顺便说一句:链接现已修复。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    您总是可以使用 jdb 并手动调试 :P

    【讨论】:

    • 我一直以为你不能用jdb附加到jvm,除非jvm启动允许调试连接我错了吗?
    • 据我了解,您提到的选项是“启用”您的“java”命令(VM)的远程调试但您也可以使用 jdb 命令。因此,您可以使用 jdb MyApp 代替 java MyApp(并以交互方式调试、设置断点、运行、停止、监视等)
    • 根据 jdb 手册页,我认为这是不正确的 -- start quote 另一种使用 jdb 的方法是将它附加到已经运行的 Java VM 上。要使用 jdb 调试的 VM 必须使用以下选项启动: -- end quote
    • 使用正确的连接器(暂时不支持)jdb 可以连接到正在运行的进程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 2011-12-19
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    相关资源
    最近更新 更多