当前位置: 首页 > 面试题库 >

堆栈跟踪如何生成?

隆宏爽
2023-03-14
问题内容

程序中没有单个方法“知道”它在堆栈中的位置。它所知道的只是它自己的小工作,它完成了并返回了。因此,当引发异常并打印堆栈跟踪时,它是从哪里来的?

在JVM中监视程序状态的每个应用程序旁边隐式地运行着一个单独的线程吗?还是JVM本身保存此信息,并且在抛出异常时以某种方式从异常中提取数据?

如果是上述两种情况之一,是否可以使用某些调用来检索堆栈跟踪(从监视器线程或JVM) 而不会 引发异常


问题答案:

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

如果您正确地观察到堆栈跟踪,您将在顶部看到错误的方法在底部出现错误的方法。

斯坦福大学教授在YouTube上做了一个精彩的演讲,以了解其工作原理。我建议看一下。

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



 类似资料:
  • 当Xdebug被激活时,只要PHP决定显示通知,警告,错误等,就会显示堆栈跟踪。堆栈跟踪显示的信息以及显示方式可以根据您的需要进行配置。 Xdebug在错误情况下显示的堆栈跟踪信息量相当保守(如果display.errors 在php.ini中设置为On)。这是因为大量的信息会减慢脚本的执行速度和浏览器中堆栈跟踪本身的渲染速度。但是,可以使堆栈轨迹以不同的设置显示更详细的信息。 堆栈跟踪中的变量

  • 问题内容: 更新 :Intellij IDEA的最新版本完全实现了我想要的功能。问题是如何在IDE外部实现此功能(以便我可以将异步堆栈跟踪信息转储到日志文件中),理想情况下无需使用检测代理。 自从我将应用程序从同步模型转换为异步模型以来,调试故障一直遇到问题。 当我使用同步API时,我总是在异常stacktraces中找到我的类,因此我知道从哪里开始寻找问题。使用异步API,我得到的堆栈跟踪既不引

  • 问题内容: 假设您执行 e.printStackTrace() ,则捕获到一个异常并在标准输出(例如控制台)上获得以下内容: 现在,我想将其发送给log4j之类的记录器,以获取以下信息: 我怎样才能做到这一点? 问题答案: 您将异常直接传递给记录器,例如 取决于log4j来呈现堆栈跟踪。

  • 我使用以下代码打印try-catch块中发生的任何异常,但是当异常发生时,logback不会打印完整的堆栈跟踪,而是写入一行错误(它没有明确说明是什么导致了它。我如何在logback输出中打印完整的堆栈跟踪? 尝试捕获异常的catch块 日志返回错误输出:

  • 问题内容: 当您在Java中使用RMI时,收到异常时将在其前面添加远程堆栈跟踪,如下所示: 那种堆栈跟踪“伪造”如何完成? 我想要什么(除了被迭代)?好吧,如果我能这样做的话,它将对我有帮助: 并使其成为引发日志记录的目的,在堆栈跟踪中也将引发异常(并且方法在链的下游)。 问题答案: 这很容易: Throwable有方法和。 从我的一个项目(非开源,但也许有一天我将打开远程调用引擎): 为了您的方

  • 问题内容: 例如,我得到了这样的堆栈跟踪: 那么,此异常的根本原因是什么?从堆栈跟踪中,我发现类中的函数存在问题!但是,当我在此处放置一个断点时,程序永远不会在该断点处停止。 谁能给这个解释!在一般情况下,我应该如何使用该堆栈情况进行调试(从下至上或从上至下读取)! 问题答案: 通常,确切的原因在堆栈跟踪的第一行,有关该异常原因的更多信息,你需要逐步向下移动,并且根本原因通常可以在堆栈跟踪底部的某