web-dev-qa-db-ja.com

取得方法Java実行中のアプリケーションのコールスタック

私は非常に巨大なJava Webベースのアプリケーションに取り組んでいます。開発中に適切なロギングが行われないため、実行順序がわからないため、ブレークポイントを設定してアプリをデバッグするのは非常に困難です。いくつかのアクションを実行した後、実行中のJavaアプリケーションの完全なコールスタックを取得するメカニズムはありますか?.

長い間ネットで検索しましたが、具体的な解決には至りませんでした。何かあるかどうか教えてください。ありがとう

15
sns

方法1:コマンドライン(JDKディストリビューションの一部)からjstackユーティリティを使用します。

方法2:シグナル3をJavaプロセスに送信します。スタックトレースをstdoutにダンプします。

方法3:アプリケーション内からThread.getAllStackTraces()を呼び出します。

_public class StackTraceDumper
{
    public static dumpAllStackTraces ()
    {
        for (Map.Entry <Thread, StackTraceElement []> entry: 
            Thread.getAllStackTraces().entrySet ())
        {
            System.out.println (entry.getKey ().getName () + ":");
            for (StackTraceElement element: entry.getValue ())
                System.out.println ("\t" + element);
        }
    }
}
_

次に、スタックトレースをダンプする必要がある場所でStackTraceDumper.dumpAllStackTraces()を使用します。

19

Thread.dumpStack()現在のスレッドのスタックトレースを標準エラーストリームに出力します。 Thread.getAllStackTraces()すべてのライブスレッドのスタックトレースのマップを返します。 Thread.getStackTrace()このスレッドのスタックダンプを表すスタックトレース要素の配列を返します。

6
Dewfy

Throwable.getStackTrace() をご覧ください。新しいThrowableを作成するだけです。実際にthrowする必要はありません。

5
Graham Borland

Ctrl + Breakを押すか、シグナル3を送信する(Unixベースのシステムの場合)ことで、スタックダンプをトリガーできます。スタックトレースを取得することに注意してくださいスレッドごと。これは標準エラーになりますので、ログがこれをキャプチャしていることを確認してください。

これは、プログラムで行うことができます。

Map<Thread, StackTraceElement[]> m = Thread.getAllStackTraces();

スタックトレースの取得と分析については 詳細 です。

お気づきのように、BTraceは別の可能性です。これが an SO answer 使用についてです。

3
Brian Agnew

いくつかのオプションがあります:

  • デバッガーで実行し、すべてのスレッドを一時停止すると、それらを検査できます
  • VisualVMを使用して、実行中のプロセスに接続し、スレッドダンプをトリガーします。 JDKが付属しています。
  • コマンドラインでjstackを使用して、スレッドをダンプします。

コードにいくつかの基本的なログを追加します。

new RuntimeException().printStackTrace();

これにより、静的トレースがstderrに送られます

0
David Roussel

AspectJのようなAOPツールを使用してこれらの値をキャプチャしてログに記録してみませんか? after()アドバイスと一緒にexecution()ポイントカットを使用できます。非実稼働デプロイメントの場合、渡された値と戻り値とともにすべてのメソッド呼び出しをログに記録できます。これは、本番環境ではオーバーヘッドが大きすぎます。そのためには、渡された値(AspectJアドバイスで取得したObject args [])をローカル変数に格納し、例外の場合にのみログに記録することができます。ただし、その場合でも、プリミティブ値がBox化されてObject []としてアドバイスに渡されるため、パフォーマンスが低下します。

0
Amol U