.NET でできるように、Java で現在のスタック トレースEnvironment.StackTrace
を取得するにはどうすればよいですか?
見つけましThread.dumpStack()
たが、それは私が望むものではありません-スタックトレースを取得したいのですが、印刷するのではありません。
.NET でできるように、Java で現在のスタック トレースEnvironment.StackTrace
を取得するにはどうすればよいですか?
見つけましThread.dumpStack()
たが、それは私が望むものではありません-スタックトレースを取得したいのですが、印刷するのではありません。
使用できますThread.currentThread().getStackTrace()
。
StackTraceElement
これは、プログラムの現在のスタック トレースを表す の配列を返します。
Thread.currentThread().getStackTrace();
スタックの最初の要素が何であるかを気にしない場合は問題ありません。
new Throwable().getStackTrace();
それが重要な場合は、現在のメソッドの位置が定義されます。
for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
System.out.println(ste);
}
Thread.currentThread().getStackTrace();
JDK1.5以降で利用可能です。
古いバージョンの場合はexception.printStackTrace()
、StringWriter()
:にリダイレクトできます。
StringWriter sw = new StringWriter();
new Throwable("").printStackTrace(new PrintWriter(sw));
String stackTrace = sw.toString();
そのためにApacheのコモンズを使用できます。
String fullStackTrace = org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e);
Android では、これを使用するのがはるかに簡単な方法です。
import android.util.Log;
String stackTrace = Log.getStackTraceString(exception);
別の解決策 ( 35 31 文字のみ):
new Exception().printStackTrace();
new Error().printStackTrace();
すべてのスレッドのスタック トレースを取得するには、jstack ユーティリティ、JConsole を使用するか、kill -quit シグナルを送信します (Posix オペレーティング システムの場合)。
ただし、これをプログラムで実行したい場合は、ThreadMXBean を使用してみてください。
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
ThreadInfo[] infos = bean.dumpAllThreads(true, true);
for (ThreadInfo info : infos) {
StackTraceElement[] elems = info.getStackTrace();
// Print out elements, etc.
}
前述のように、現在のスレッドのスタック トレースのみが必要な場合は、はるかに簡単Thread.currentThread().getStackTrace()
です。
ばかげて、それはThread.currentThread().getStackTrace();
グアバで弦を張るには:
Throwables.getStackTraceAsString(new Throwable())
スタックトレースを含む文字列を返すユーティリティメソッドがあります:
static String getStackTrace(Throwable t) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw, true);
t.printStackTrace(pw);
pw.flush();
sw.flush();
return sw.toString();
}
そして、次のようにロジットします...
...
catch (FileNotFoundException e) {
logger.config(getStackTrace(e));
}
try {
}
catch(Exception e) {
StackTraceElement[] traceElements = e.getStackTrace();
//...
}
また
Thread.currentThread().getStackTrace()
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
配列の最後の要素は、スタックの一番下を表します。これは、シーケンス内で最も新しいメソッド呼び出しです。
A StackTraceElement has getClassName(), getFileName(), getLineNumber() and getMethodName().
StackTraceElement をループして、目的の結果を取得します。
for (StackTraceElement ste : stackTraceElements )
{
//do your stuff here...
}
多分あなたはこれを試すことができます:
catch(Exception e)
{
StringWriter writer = new StringWriter();
PrintWriter pw = new PrintWriter(writer);
e.printStackTrace(pw);
String errorDetail = writer.toString();
}
文字列「errorDetail」にはスタックトレースが含まれています。
プロセスの現在のコール スタックを確認する場合は、jstack ユーティリティを使用できます。
Usage:
jstack [-l] <pid>
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core>
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server)
Options:
-F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message
これは古い投稿ですが、これが私の解決策です:
Thread.currentThread().dumpStack();
詳細情報とその他のメソッドがあります:http: //javarevisited.blogspot.fr/2013/04/how-to-get-current-stack-trace-in-java-thread.html