2009-06-22 28 views
16

javaの特定のスレッドの呼び出しトレースを出力する方法はありますか?Javaの呼び出しトレース

スタックトレースは必要ありません。私はトレースのための各オブジェクトの呼び出しのシーケンスが欲しいです。すべてのスレッド内のすべてのオブジェクトの各メソッド呼び出しのための行を表示し

答えて

10

btraceがあり、この種の動作に使用できます。

2

Runtime.traceMethodCalls()

+0

日のホットスポットのVMから取得することができます。私は 'java_g'でJavaデバッグを実行する必要があると読んだ。何か案は? – JavaRocky

+0

はい、私にとって 'Runtime.getRuntime()。traceMethodCalls(true);'は何もしません。 'javac'や' java'に引数を渡す必要がありますか? –

+0

Javaバージョン "1.8.0_111"のままではまだありません –

2

あなたは、基本的局面は、現在のスレッドがあることを意味したかどうかを決定することができる何らかの形のアスペクト指向プログラミングをしたいと思いますロギングコール。 (代わりに明示的にすべてのメソッドにログを記録するのは苦しいでしょう)

Javaには、AspectJSpringなど多くのAOPフレームワークがあります(もちろん、SpringはAOP以上のものです)。

にすべてのメソッド呼び出しを適用することは難しいかもしれませんが...私はAspectJについての経験はありませんが、Spring AOPは基本的にコンポーネントの周りのAOPを有効にするように設計されています。 Springにとって効果的に知られていないクラスは、簡単には変更できません。私はSpring AOPを使ってからしばらくしてきました。それ以降は事が起こっている可能性があります:)

2

呼び出しトレースを持つ新しいThrowableオブジェクトを作成することができました。また、いくつかの文字列操作を使用して、コールスタックを取得できます。

Throwable t = new Throwable(); 
System.out.println(t.getStackTrace()[1].toString()); 

この方法で情報を取得するかどうかはわかりませんが、それは良い方法ですか。 :)

+1

痛みを伴い、デバッグ中にローカルトレースに使用するのが遅くなります。 – glmxndr

13

あなたはこの面白いかもしれないと思います。これは、実際に出力を記録するslf4jフレームワークを使用して、メソッドへの入口と出口のロギングを追加するJavaエージェントです。そして、それはあなただけに興味がある、そのスレッドをプリントアウトへのロギングフレームワークを構成するの問題です

http://www.slf4j.org/extensions.html#javaagent

。(ただ明示されるように:1)私は2)それは私のために働く、それを書いた:) )

+1

WOW。マインド=ブローン! – JavaRocky

+0

絶対に素晴らしい!それを試して、それは素晴らしい:)この非常に便利な拡張機能のおかげで働いた! – stratwine

+0

これをアンドロイドプロジェクトでどうやって使うことができますか? – RegisteredUser

3

Javaコードの実行をトレースする場合は、InTraceというツールを使用できます。

注:InTraceは、私が書いた無料のオープンソースツールです。 Btraceよりも簡単な方法がHouseMD使用している

1

、あなたは出力にトレースメソッド呼び出しは思えない窓にhere

関連する問題