回答:
はい、単に使用します
Thread.dumpStack()
public static void dumpStack() { new Exception("Stack trace").printStackTrace(); }
stderr
の意味合いのようです。
(Ramの提案のようにシステム内のすべてのスレッドではなく)現在のスレッドのみのトレースが必要な場合は、次のようにします。
Thread.currentThread()。getStackTrace()
発信者を見つけるには、次のようにします。
private String getCallingMethodName() {
StackTraceElement callingFrame = Thread.currentThread().getStackTrace()[4];
return callingFrame.getMethodName();
}
そして、その呼び出し元が誰であるかを知る必要があるメソッド内からそのメソッドを呼び出します。ただし、警告の言葉:リスト内の呼び出しフレームのインデックスは、JVMによって異なる可能性があります!すべては、トレースが生成されるポイントに到達する前に、getStackTrace内にある呼び出しのレイヤーの数に依存します。より堅牢なソリューションは、トレースを取得し、それを反復してgetCallingMethodNameのフレームを探し、さらに2つの手順を実行して真の呼び出し元を見つけることです。
次のようなスタックトレースを取得できます。
Throwable t = new Throwable();
t.printStackTrace();
フレームにアクセスする場合は、t.getStackTrace()を使用してスタックフレームの配列を取得できます。
ホットスポットコンパイラが最適化のためにビジー状態である場合、このスタックトレース(他のスタックトレースと同様)で一部のフレームが失われる可能性があることに注意してください。
log.log(Level.SEVERE, "Failed to do something", new Throwable());
Thread.dumpStack()が実際に例外をスローすることに注意してください。
new Exception("Stack trace").printStackTrace();
プロセスにQUITシグナルを送信することにより、実行中のJavaプロセスでThread.getAllStackTraces()を実行するためにシグナルをJVMに送信することもできます。
Unix / Linuxの場合:
kill -QUIT process_id
ここで、process_idはJavaプログラムのプロセス番号です。
Windowsでは、アプリケーションでCtrl-Breakを押すことができますが、通常、コンソールプロセスを実行している場合を除き、これは表示されません。
JDK6には、別のオプションであるjstackコマンドが導入されました。これは、コンピューターで実行中のJDK6プロセスのスタックを表示します。
jstack [-l] <pid>
これらのオプションは、運用環境で実行されていて簡単に変更できないアプリケーションに非常に役立ちます。ランタイムデッドロックやパフォーマンスの問題を診断するのに特に役立ちます。
http://java.sun.com/developer/technicalArticles/Programming/Stacktrace/ http://java.sun.com/javase/6/docs/technotes/tools/share/jstack.html
キャプチャ出力が必要な場合
StringWriter sw = new StringWriter();
new Throwable("").printStackTrace(new PrintWriter(sw));
String stackTrace = sw.toString();
Java 9は StackWalker
、スタックをウォークするためおよびサポートするクラスが。
以下は、Javadocからの抜粋です。
この
walk
メソッドStackFrames
は、現在のスレッドの順次ストリームを開き、指定された関数を適用してStackFrame
ストリームをウォークします。ストリームは、スタックが生成された実行ポイントを表す最上部のフレームから最下部のフレームまで、スタックフレーム要素を順番に報告します。StackFrame
ストリームは時に歩行メソッドが返す閉じられています。閉じたストリームを再利用しようとすると、IllegalStateException
がスローされます。...
現在のスレッドのトップ10スタックフレームをスナップショットするには、
List<StackFrame> stack = StackWalker.getInstance().walk(s -> s.limit(10).collect(Collectors.toList()));
コードでこれを行う必要さえありません。Java HPROFをプロセスに接続し、いつでもControl- \を押して、ヒープダンプや実行中のスレッドなどを出力できます。。。アプリケーションコードを変更する必要はありません。これは少し時代遅れです。Java6にはGUI jconsoleが付属していますが、HPROFは非常に便利だと思います。
Rob Di Marcoの回答は、に出力してよかった場合に断然最良ですstderr
。
String
通常のトレースに従って新しい行を使用してにキャプチャする場合は、次のようにします。
Arrays.toString(Thread.currentThread().getStackTrace()).replace( ',', '\n' );