私は非常に巨大なJava Webベースのアプリケーションに取り組んでいます。開発中に適切なロギングが行われないため、実行順序がわからないため、ブレークポイントを設定してアプリをデバッグするのは非常に困難です。いくつかのアクションを実行した後、実行中のJavaアプリケーションの完全なコールスタックを取得するメカニズムはありますか?.
長い間ネットで検索しましたが、具体的な解決には至りませんでした。何かあるかどうか教えてください。ありがとう
方法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()
を使用します。
Thread.dumpStack()
現在のスレッドのスタックトレースを標準エラーストリームに出力します。 Thread.getAllStackTraces()
すべてのライブスレッドのスタックトレースのマップを返します。 Thread.getStackTrace()
このスレッドのスタックダンプを表すスタックトレース要素の配列を返します。
Throwable.getStackTrace()
をご覧ください。新しいThrowable
を作成するだけです。実際にthrow
する必要はありません。
Ctrl + Breakを押すか、シグナル3を送信する(Unixベースのシステムの場合)ことで、スタックダンプをトリガーできます。スタックトレースを取得することに注意してくださいスレッドごと。これは標準エラーになりますので、ログがこれをキャプチャしていることを確認してください。
これは、プログラムで行うことができます。
Map<Thread, StackTraceElement[]> m = Thread.getAllStackTraces();
スタックトレースの取得と分析については 詳細 です。
お気づきのように、BTraceは別の可能性です。これが an SO answer 使用についてです。
いくつかのオプションがあります:
コードにいくつかの基本的なログを追加します。
new RuntimeException().printStackTrace();
これにより、静的トレースがstderrに送られます
AspectJのようなAOPツールを使用してこれらの値をキャプチャしてログに記録してみませんか? after()アドバイスと一緒にexecution()ポイントカットを使用できます。非実稼働デプロイメントの場合、渡された値と戻り値とともにすべてのメソッド呼び出しをログに記録できます。これは、本番環境ではオーバーヘッドが大きすぎます。そのためには、渡された値(AspectJアドバイスで取得したObject args [])をローカル変数に格納し、例外の場合にのみログに記録することができます。ただし、その場合でも、プリミティブ値がBox化されてObject []としてアドバイスに渡されるため、パフォーマンスが低下します。