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

そのためにAspectJを使用できます。まさにあなたのユースケースのこの説明を見てください。

于 2009-10-24T08:47:13.627 に答える
0

1 つのアプローチは、 BCELのようなものを使用してターゲット バイトコードを前処理し、すべてのメソッドのエントリと終了時に独自のコードへの呼び出しを挿入することです (おそらく、メソッド全体を try/finally ブロックでラップして終了し、例外の終了をキャッチするのが最善です)。 . これから、コール ツリーを正確に推測できます。

于 2009-10-24T07:38:06.487 に答える