如何生成堆栈跟踪?

时间:2012-10-12 18:40:00

标签: java exception stack-trace

程序中没有单个方法“知道”它在堆栈中的位置。它所知道的只是它自己的小工作,它就是这样做并且回归。因此,当抛出异常并打印堆栈跟踪时,它来自何处?

是否隐含地在JVM中的每个应用程序旁边运行一个单独的Thread来监视程序的状态?或者JVM本身是否拥有此信息,并且异常以某种方式从它中引出数据?

如果是这种情况之一,是否可以使用某些调用来检索堆栈跟踪(来自监视器线程或JVM)而不抛出异常?

4 个答案:

答案 0 :(得分:5)

每个帖子都有自己的stack。每个方法调用都会创建一个堆栈帧。如果在任何方法的代码中发生了错误,那么它将传播到调用方法。这样JVM可以跟踪哪个方法生成错误以及调用层次结构是什么。

如果正确观察堆栈跟踪,您将看到顶部出现错误而底部出现层次结构的方法。

斯坦福大学教授在youtube进行了一次精彩的讲座,了解它是如何运作的。我建议看一下。

注意:这是理论。如果您想知道API的工作原理,@ Peter Lawrey的回答可能对您有帮助。

答案 1 :(得分:4)

它来自正在运行代码的Thread类。

Thread.dumpStack();

要看到它,你可以:

    StackTraceElement[] trace = Thread.currentThread().getStackTrace();
    for (int i=0; i < trace.length; i++)
        System.out.println("\tat " + trace[i]);

答案 2 :(得分:3)

您可以使用Thread.currentThread了解方法所属的线程。使用此线程,您可以获取StackTrace,因为JVM中的每个线程都有一个堆栈。此外,main程序在main主题中运行。

答案 3 :(得分:3)

当你创建一个Throwable(而不是你抛出它时)它会记录堆栈跟踪是一个与Throwable相关的低级/隐藏方式。当您第一次从低级别信息创建StackTraceElement[]对象时调用getStackTrace()。由于通常不使用堆栈跟踪,所以这不是懒惰的。