1

我想通过将程序的方法调用显示为树的分支来编写 Java 程序的简单可视化。这可以很简单地通过让程序本身告诉可视化它正在做什么来完成,但我希望能够使用任何 Java 方法/类来做到这一点,而不仅仅是我修改的那些。

我需要的是能够观察程序调用的方法以及在该方法中调用了哪些方法等等。显然,堆栈跟踪正好提供了这个功能:

 java.lang.NullPointerException
     at MyClass.mash(MyClass.java:9)
     at MyClass.crunch(MyClass.java:6)
     at MyClass.main(MyClass.java:3)

所以我考虑让我想监控的程序在一个线程中运行,然后只看那个线程的堆栈。但是,线程类并不真正支持这一点。它只支持打印当前堆栈。

当然,现在我想简单地更改 System 类的 PrintStream,以便线程将其堆栈打印到我的PrintStream 中,但这感觉有点不对。

有一个更好的方法吗?我可以使用任何预先存在的类/方法吗?

另外,我目前正在下载 Java 源代码,以检查线程类如何准确地打印其堆栈,以便我可以子类化线程并用我自己的 getStack() 方法模仿 dumpStack() 方法。

4

5 回答 5

2

还可以查看随最新 Java 版本一起提供的 VisualVM。

于 2009-10-24T09:12:54.890 回答
1

哦,拍摄,查看源代码我注意到线程类有一个方法 public StackTraceElement[] getStackTrace(),它只是不在我正在阅读的文档中。现在我觉得很笨。

所以,是的,这似乎是解决方案。

于 2009-10-24T07:44:10.263 回答
0

一种方法可能是使用诸如BCEL之类的东西来预处理目标字节码,以便在每个方法进入和退出时插入对您自己代码的调用(最好通过将整个方法包装在 try/finally 块中来执行退出,以捕获异常退出) . 由此,您可以准确地推断出调用树。

于 2009-10-24T07:38:06.487 回答
0

您可以为此使用AspectJ。看看这个您的用例的描述。

于 2009-10-24T08:47:13.627 回答
0

看看ThreadMXBean类——我提供了你需要的东西。本质上,您:

  • 调用 ManagementFactory.getThreadMXBean() 以获取 ThreadMXBean 的实例;
  • 在生成的 ThreadMXBean 上调用 getAllThreadIds() 以枚举当前线程;
  • 调用 getThreadInfo() 从给定的线程列表中获取前 n 个堆栈跟踪元素。
于 2009-10-24T09:59:23.073 回答