如何生成堆栈跟踪?

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

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

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

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

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

斯坦福大学教授在youtube上有一个很棒的讲座,了解它是如何工作的。 我建议看一下。

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

它来自运行代码的Thread类。

 Thread.dumpStack(); 

要看到它,你可以:

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

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

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