如何打印java方法调用堆栈?

时间:2017-08-29 17:15:25

标签: java debugging

当您调试运行某些并行线程的复杂Java代码时,捕获所有断点并不容易,有时很难找到导致问题的路径。在这种情况下,我们需要在可疑位置打印方法调用堆栈。如何在Java中打印方法调用堆栈?

3 个答案:

答案 0 :(得分:3)

以下是如何从源文件中的给定位置打印堆栈跟踪。

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() + ")");
}

答案 1 :(得分:0)

只需使用以下代码

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

这是StackTraceElement的toString方法的定义

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

因此您可以直接使用打印StackTraceElement。

答案 2 :(得分:0)

使用 Java 8

Arrays.stream(Thread.currentThread().getStackTrace()).forEach(s -> System.out.println(
    "\tat " + s.getClassName() + "." + s.getMethodName() + "(" + s.getFileName() + ":" + s
        .getLineNumber() + ")"));