12

从调试打印输出中打印堆栈跟踪的最简单方法是什么?通常在测试期间,您想知道导致引发调试消息的情况的调用堆栈。

4

8 回答 8

20

如果您使用的是 log4j

Exception e = new Exception();
log.error("error here", e);

会将堆栈跟踪打印到您的日志中。

于 2008-09-12T19:07:34.600 回答
11

Thread.dumpStack();

于 2008-09-10T18:27:42.670 回答
6

如果要将堆栈跟踪保存到字符串中,可以这样做;

String exception = "";
for (StackTraceElement element : e.getStackTrace())
   exception += element.toString() + "\n";

其中 e 显然是一个例外。

此外,自动生成自己的异常只是为了找到调试的堆栈跟踪,这听起来很奇怪。获取 Eclipse 并使用它的调试模式,真是太棒了。

于 2008-09-11T11:20:31.987 回答
4

只需创建一个任意异常对我来说就可以了:

System.out.println("Oops, the bad thing happened");
new IllegalStateException().printStackTrace();
于 2008-09-10T18:06:44.703 回答
3

和@jjnguy 说的一样,如果没有异常,也可以调用Thread.getStackTrace()。

于 2008-09-10T18:07:18.913 回答
2

您应该在 try-catch 块中捕获异常。

e.getStackTrace();

这将返回 StackTraceElement[] ,然后您可以对其进行解释。

还:

e.printStackTrace()

将...打印堆栈跟踪。

于 2008-09-10T18:05:41.333 回答
2

要简单地将当前堆栈跟踪打印到 stderr,您可以调用:

Thread.dumpStack();

它本身只是调用:

new Exception("Stack trace").printStackTrace();

要输出到stdout而不是 stderr,请传递System.outprintStackTrace()

new Exception("Stack trace").printStackTrace(System.out);
于 2016-04-06T00:19:41.823 回答
1

只是因为我自己需要它:

受答案启发如何使用堆栈跟踪或反射找到方法的调用者?,您可以使用检索调用堆栈

StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace()

然后你处理和打印/记录你感兴趣的任何东西。比使用更多的工作Thread.dumpStack(),但更灵活。

于 2009-11-16T14:51:05.010 回答