2009-07-28 44 views
6

私はバグを追跡するのに本当の問題を抱えており、どのメソッドが特定のメソッドを呼び出したか知ることは大いに役立ちます。 Javaから呼び出し階層を取得する簡単な方法はありますか? Javaは、アプリケーションの小さな部分ですので、私はコンパイルすることはできませんし、eclipse/net beansでアプリケーション全体を実行するので、IDEデバッガの呼び出し階層にアクセスすることはできません。Javaで呼び出し階層を取得する

+0

コールの階層ではなく、スタックトレースが本当に必要なように聞こえます。 (質問の件名を編集することは可能ですか?) –

+0

微妙な違いがない限り、スタックトレースは呼び出し階層です。 –

+1

コールの階層構造は、プロシージャを呼び出すことができるすべての場所のツリーです。 –

答えて

14
Thread.currentThread().getStackTrace(); 

または

Exception ex = new Exception(); 
ex.printStackTrace(); 

それはかなり遅いが、デバッグのための罰金です。 API docs here

0

例外をスローし、すぐにキャッチしてスタックトレースを分析するのが最も良い方法です。

私はこれが、Log4Jが呼び出し元のメソッドを記録する方法であると考えています。

+2

Thread.dumpStack()または人為的な例外をスローする必要はありません。 – djna

+0

これはlog4jが実行する方法であることは間違いありません。 Java 1.5以降、Nelsonの提案するcurrentThread()。getStackTrace()メソッドが利用できるようになったので、このアプローチはもはや必要ではありません。 – mikej

1

Javaはアプリのごく一部なので、Eclipse全体/ネットBeanでアプリケーション全体をコンパイルして実行することはできません。したがって、IDEデバッガの呼び出し階層にアクセスすることはできません。

あなたはアプリケーションをまったく実行する必要はありません。 Eclipseでプロジェクトを作成する場合は、組み込みのCall Hierarchyツールを使用して、メソッドを呼び出す可能性のある場所をすべて見つけることができます。

トレードオフ:コール階層ツールは、メソッドが呼び出された場所のすべてを提供します。あなたがすべての可能性を知りたい/必要とするなら、これは良いことです。 Neslsonの提案Thread.currentThread().getStackTrace()は、この呼び出しのためのプログラムのプロセス中にメソッドが呼び出される場所を示します。この呼び出し中にすべてのコードパスを実行しない可能性があるというニュアンスがあります。特定の動作が表示され、その動作状況を知りたい場合は、getStackTrace()オプションを使用してください。

関連する問題