【问题标题】:Print current stack trace in JavaScript在 JavaScript 中打印当前堆栈跟踪
【发布时间】:2017-08-31 09:45:25
【问题描述】:

如何从 JavaScript 打印堆栈跟踪?

答案How can I get a Javascript stack trace when I throw an exception? 处理抛出异常,但我需要打印堆栈跟踪来调试内存泄漏。

基本上我和Get current stack trace in Java 有同样的问题,但对于 JavaScript。

How to print a stack trace in Node.js? 相似,但它是Node.js,我想知道JavaScript,更一般地说,是否不同。

【问题讨论】:

  • 您在接受的答案中看到stackTrace 函数了吗?归结为var e = new Error(); console.log(e.stack)
  • 谢谢 Mike,但我想要一个关于 stackoverflow 的简单直接答案的页面,谷歌会为查询“JavaScript 打印堆栈跟踪”编制索引。
  • 但这仍然是一个重复的问题,对吧?您不能在此处发布您的答案作为该问题的答案吗?谷歌搜索“JavaScript 打印堆栈跟踪”将上一个问题作为第一个结果,即使我离开了“Google 气泡”。
  • 迈克,这个问题与发生异常时打印堆栈跟踪有关。我的问题与异常无关。上下文不同。
  • 值得商榷。这个问题是以这种方式表达的,但大多数答案都是以这样一种方式概括的,即您可以在没有错误处理的情况下获得堆栈跟踪。无论如何,我不会将其标记为重复,因为在这种情况下我不想成为唯一的真相来源,因为有人反对它。我只想说,如果其他人决定将其标记为重复,我不会感到惊讶。

标签: javascript node.js


【解决方案1】:

您可以通过创建错误并打印其stack 属性来获取堆栈跟踪。

var stackTrace = Error().stack;
print(stackTrace); // if print is available
console.log(stackTrace); // if console.log is available
alert(stackTrace); // ditto
var xhr = new XMLHttpRequest(); xhr.open(...); xhr.send(stackTrace); // submit to server
// or do whatever else with the variable

这与console.trace() 不同,适用于所有情况,即使console 类在您的环境中不可用。 (当然,如果print 不可用,您可以使用console.log 或您环境中的任何其他功能进行打印)。

【讨论】:

  • Node.js 没有 print,因此您的代码在问题的上下文中不起作用,而 console.trace() 从第一个版本开始就在 Node.js 中工作。跨度>
  • print 在这里是多余的。这只是一个例子。 Error().stack 是重要的部分。此外,提问者在他的问题中表示他想要比 node.js 更一般的答案。所以上下文不限于 node.js。比 node.js 更普遍的是,您可以通过 Error().stack 执行此操作,并使用您可用的任何功能打印其输出。 Error().stack 可以在任何 JavaScript 版本中工作,而 console.trace() 则不能。另外,如果你这样做,你可以让 print 在 node.js 中工作:print=console.log
  • 最后一句话是这个错误答案的全部原因:支持 ES5 或更高版本的 everything 都支持console.trace(),而您的答案显示的代码不起作用在任何浏览器中,也不是在 Node.js 中 - 如果您想提及 new Error().stack,那么请务必将其作为第二部分添加到您的答案中。就目前而言,您发布的答案不适用于任何常见的 JS 引擎,因此is a bad answer。记住为什么首先存在 SO:如果答案有代码,那么代码应该可以工作
  • 感谢您的回复。它对我完全有用!
  • 这是最好的。谢谢。没有新的真的很好。
【解决方案2】:

documentation 表示可以通过以下方式完成:

const targetObject = {};
Error.captureStackTrace(targetObject);
targetObject.stack;  // Similar to `new Error().stack`

这段代码 sn-p 在 targetObject 上创建了一个 .stack 属性,访问该属性时会返回一个字符串,该字符串表示代码中调用 Error.captureStackTrace() 的位置。

【讨论】:

    【解决方案3】:

    这行代码获取堆栈跟踪并打印出来:

    console.trace();
    

    来源:https://developer.mozilla.org/en-US/docs/Web/API/Console/trace

    【讨论】:

    • @SYOBSYOT 回答您自己的问题是完全可以接受和鼓励的。 stackoverflow.com/help/self-answer
    • 控制台 API 大约在 10 年前被正式采用 - 任何仍然不支持它的 JS 引擎都可以安全地忽略这样的问题:console.trace() 是默认正确答案没有像“我如何在这个高度利基的超级传统 JS 引擎中做 X”这样的额外细节。
    • 恕我直言,这个答案实际上并没有回答这个问题。问题是 Get 当前堆栈跟踪,而不是 Print 当前堆栈跟踪。打印堆栈跟踪很容易,但很难。我想知道var currentStackTrace = /* what code here ? */的答案
    • @StijndeWitt 您可以尝试解析Error 上的stack 字段,例如var currentStackTrace = Error().stack.substring(6).split(" at ")currentStackTrace 设置为字符串数组,其中每个字符串都是堆栈中的一行。跨度>
    • @MichaelOsofsky 是的,但我说的是这个公认的答案实际上并没有回答这个问题。就目前而言,问题标题应该更改为“在 Javascript 中打印当前堆栈跟踪”,或者接受的答案应该更改为 the one from SYOB SYOT,我们应该从中删除 print() 调用。
    猜你喜欢
    • 1970-01-01
    • 2015-06-07
    • 2014-02-04
    • 1970-01-01
    • 2015-07-27
    • 2014-08-06
    • 2020-07-25
    • 2018-07-06
    相关资源
    最近更新 更多