2017-08-29 5 views
-3

いくつかの並列スレッドが実行されている複雑なJavaコードをデバッグすると、すべてのブレークポイントをキャプチャするのは簡単ではなく、問題の原因となったパスを見つけるのは難しい場合もあります。このようなシナリオでは、疑わしい場所にメソッド呼び出しスタックを出力する必要があります。 Java内でメソッド呼び出しスタックを印刷するにはどうすればよいですか?Javaメソッド呼び出しスタックを印刷するには?

+5

IntelliJのような実際のIDEを使用する方がよいでしょう。完全なスタックなどが表示されます。 – duffymo

答えて

1

ソースファイル内の特定の場所からスタックトレースを出力する方法は次のとおりです。

System.out.println("Printing stack trace:"); 
StackTraceElement[] elements = Thread.currentThread().getStackTrace(); 
for (int i = 1; i < elements.length; i++) { 
    StackTraceElement s = elements[i]; 
    System.out.println("\tat " + s.getClassName() + "." + s.getMethodName() + "(" + s.getFileName() + ":" + s.getLineNumber() + ")"); 
} 
+3

これは、IDEでデバッガを使用するより多くの情報を提供するとは思わないと思います。また、デバッガとは違って、変数の値を見ることはできません。私はこれが役に立つと思われる状況は想像できません。それは、あなたが自転車をF1に持ってきたことを私に尋ねます。 –

+0

正解ですが、あまり役に立ちません。 – duffymo

+2

さらに簡単に新しいThrowable()。printStacktrace() –

-1

ちょうどあなたがのStackTraceElementを印刷するために直接使用することができますので、これはのStackTraceElement

public String toString() { 
    return getClassName() + "." + methodName + 
     (isNativeMethod() ? "(Native Method)" : 
     (fileName != null && lineNumber >= 0 ? 
      "(" + fileName + ":" + lineNumber + ")" : 
      (fileName != null ? "("+fileName+")" : "(Unknown Source)"))); 
} 

のtoStringメソッドの定義であるコード

System.out.println("Stack trace:"); 
StackTraceElement[] stackTraces = Thread.currentThread().getStackTrace(); 
for (int i = 1; i < stackTraces.length; i++) { 
    System.out.println(stackTraces[i]); 
} 

の下に使用します。

+0

なぜdownvotingですか? – nagendra547

関連する問題