【问题标题】:Java - How to programatically get a stack trace on a remote processJava - 如何以编程方式获取远程进程的堆栈跟踪
【发布时间】:2011-02-22 14:59:53
【问题描述】:

如何从 Java 程序中获取远程 VM 中运行的已知线程的堆栈跟踪?

远程 JVM 是否需要使用任何特殊开关运行?

【问题讨论】:

  • 它在同一个盒子上 - 所以不是那么远程,而是不同的 jvm。

标签: java stack-trace remote-debugging


【解决方案1】:

您真的需要在 Java 中以编程方式执行此操作(我猜是因为您的问题如此明确)?

不管怎样,如果没有,那么在 Linux 上你可以在命令行上执行此操作:

kill -3 <pid>

编辑:对于编程访问,在启用 JMX 的情况下启动应用程序,通过 JMX 连接到它并使用 ThreadMXBean.getThreadInfo 获取每个正在运行的线程的堆栈跟踪。

如果您在同一台机器上有多个 JVM,每个都需要自己不同的 JMX 端口,您可以通过反复尝试从池中随机选择一个并注销结果来处理此问题。

请参阅here,了解有关创建自定义 JMX 客户端的分步信息。

【讨论】:

  • 是的——特别是通过Java
  • JConsole 可以生成堆栈跟踪(因此假设您可以在启用 JMX 的情况下运行应用程序).​​..查看 JConsole 触发以在控制台中生成堆栈跟踪的 MBean(所有名称都是通过控制台暴露)。如果您通过 jmx 连接到应用程序,您可以自己调用这些,
  • 给你 - 你可以通过 JMX 连接并调用 ThreadMXBean.getThreadInfo(long[], int) : download.oracle.com/javase/1.5.0/docs/api/java/lang/management/…, int)
  • 远程JVM的pid在哪里指定?
  • 对于 JMX,您需要在同一台机器上的每个进程使用不同的端口来运行 JMX。如果您有多个进程,您可以让每个进程在启动时尝试某个范围内的随机端口,然后重试直到找到空闲端口。这对你想要的可能有点过头了,但是在启用 JMX 的情况下运行确实有它自己的优势。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 2020-04-11
相关资源
最近更新 更多