2009-10-24 57 views
1

我想通过将程序的方法调用显示为树的分支来编写Java程序的简单可视化。这可以通过让程序本身告诉可视化界面正在做什么来完成,但我希望能够通过任何Java方法/类来完成,而不仅仅是我修改过的方法。从Java内部监控Java

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

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

所以我想关于有我想监视在一个线程中运行,然后看看这线程的堆栈程序。但是,线程类并不真的支持这一点。它只支持打印当前的堆栈。

现在我,当然,简单地改变系统类的PrintStream因此线程将打印的纸叠装入的PrintStream,但这种感觉一种错误的想法。

有没有更好的方法来做到这一点?是否有任何预先存在的类/方法可以使用?

此外,我正在下载Java源代码,以检查线程类是如何打印其堆栈的,以便我可以创建子类线程并使用我自己的getStack()方法模拟dumpStack()方法。

+1

我知道它'感觉错了',但它不是 - 可以重定向System.out(写入文件的PrintStream)我最终编写了自己的控制台,之前我已经完成了像这样的事情现在要知道所有这些都在libs中,无论是在java.util中还是在其他地方:如果你可以在任何地方获得dumpStack(),将它转储到任何你想要的地方:这就是它的目的。 – 2009-10-24 07:42:11

回答

1

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

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

+0

这是一个“更新”的补充。你可能一直在看Java 1.4 javadoc。 – 2009-10-24 13:04:54

0

一种方法可能是使用类似BCEL的东西来预处理目标字节码,以便在每个方法入口和出口处插入对自己的代码的调用(可能最好通过在try/finally块中包装整个方法来退出捕获异常退出)。从这里,您可以完全按照它的情况推导出调用树。

2

另请参阅VisualVM,附带最新的Java发行版。

+0

您也可以将自己的自定义插件添加到此框架中,而不会有太多的麻烦。 – reccles 2009-10-24 16:39:31

+0

它是开源的,所以至少它显示了一种方法来做到这一点... – PhiLho 2009-10-25 14:30:56

0

看看ThreadMXBean类 - 它我提供你所需要的。本质上,你:

  • 调用ManagementFactory.getThreadMXBean()来获取ThreadMXBean的一个实例;
  • 在生成的ThreadMXBean上调用getAllThreadIds()来枚举当前线程;
  • 调用getThreadInfo()从给定线程列表中获取前n个堆栈跟踪元素。