【问题标题】:Thread dump programmatically /JDI (Java Debugger Interface)以编程方式转储线程 /JDI(Java 调试器接口)
【发布时间】:2023-04-06 03:30:01
【问题描述】:

我喜欢以编程方式生成线程转储。我了解到基本上有两种方法可以做到这一点:

  1. 使用“Java 虚拟机工具接口”JVM-TI
  2. 使用更高抽象的“Java 调试器接口”JDI

对于 JVM-TI,我能够找到一些有用的信息,但我必须编写一个 JNI-DLL,至少目前我想避免这种情况。通过 JDI,我可以使用 Java,而且似乎可以在应用程序中使用它。但我无法找到某种教程或 HOWTO。我能找到的唯一文档是 Java-Docs http://java.sun.com/j2se/1.5.0/docs/guide/jpda/jdi/,它不是很有帮助,因为它没有告诉我如何使用这些类。

那么,有人知道我可以阅读的好教程/书吗?

感谢您的帮助!

【问题讨论】:

    标签: java debugging thread-dump


    【解决方案1】:

    还有第三种方式:Thread.getAllStackTraces()

    http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#getAllStackTraces()

    这比调试器界面简单多了……

    【讨论】:

      【解决方案2】:

      您可以从http://java.sun.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html 获得几乎所有需要的线程信息,包括死锁

      【讨论】:

        【解决方案3】:

        Thread.getAllStackTraces() 仅转储所有线程的执行跟踪,但不提供特定线程已获得的对象锁或特定线程一直在等待的锁的信息。基本上,我们将无法解决这个问题。

        【讨论】:

          【解决方案4】:

          您是否考虑过远程替代方案? IE。 VisualVM

          jps and jstack 也是 JDK 5 中包含的有用工具,提供了一种快速命令行方法来获取所有当前线程的堆栈跟踪。

          本文建议将 JDI 也用作remote tool

          所以我不确定您是否可以在自己的程序中触发线程转储,而是找到一种方法在 Unix 平台上向自己发送 SIGQUIT 信号(kill -3),或者在 Unix 上按 Ctrl-\ 键或Windows 平台上的 Ctrl-Break。

          另外,JDI wasn't intended to be used to debug the same process in which the JDI client is running。我刚刚链接到的这个线程仍然是我发现在同一程序中实际使用 JDI 最接近的线程。

          【讨论】:

          • 谢谢,现在至少我有一个特定的论坛可以提问!
          • 不客气。如果这是最有帮助的方法,请不要忘记接受这个答案;)
          • 请注意,jvisualvm 连接方法仅适用于“您自己的”JVM,而不适用于其他人。这包括作为 Windows 服务运行时。
          • @Thorbjørn: 那么你一定是JVM进程的所有者吧?
          • 据我了解,您登录的用户必须与运行该进程的用户相同。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-02-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-13
          相关资源
          最近更新 更多