在JavaScript中获取当前堆栈跟踪

Mic*_*sky 14 javascript node.js

如何从JavaScript打印堆栈跟踪?

答案如何在抛出异常时获取Javascript堆栈跟踪?处理抛出异常,但我需要打印堆栈跟踪来调试内存泄漏.

基本上我有一个相同的问题,如在Java中获取当前堆栈跟踪,但对于JavaScript.

以及如何在Node.js中打印堆栈跟踪?是类似的,但它是Node.js,我想知道JavaScript,更一般地说,如果它是不同的.

Mic*_*sky 19

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

console.trace();
Run Code Online (Sandbox Code Playgroud)

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

  • 恕我直言,这个答案实际上并没有回答问题。问题是**获取**当前堆栈跟踪,而不是**打印**当前堆栈跟踪。打印堆栈跟踪很容易,但获取它却很困难。我想知道 `var currentStackTrace = /* 这里的代码是什么?*/` (13认同)
  • @SYOBSYOT完全可以接受,也可以鼓励您回答自己的问题。https://stackoverflow.com/help/self-answer (2认同)
  • @StijndeWitt,您可以尝试解析 `Error` 上的 `stack` 字段,例如 `var currentStackTrace = Error().stack.substring(6).split(" at ")` 将 `currentStackTrace` 设置为一个字符串数组,其中每个字符串都是堆栈中的一行。 (2认同)
  • `Error().stack` 是更好的答案,因为它更通用。它可以让你做这个答案所做的一切,甚至更多。 (2认同)

SYO*_*YOT 6

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

print(Error().stack);
Run Code Online (Sandbox Code Playgroud)

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

  • @Mike'Pomax'Kamermans 你在这里完全不合理。每个人,实际上是任何程序员,都可以查看该答案(就像在我为清楚起见编辑它之前一样)并理解“打印”并不重要。实际上,这个答案比公认的答案更好,因为 `console.trace()` 只能将其输出到控制台,而 `Error().stack` 为您提供选项 - 提交到服务器等。 (3认同)
  • ```print```不在这里。这只是一个例子。``Error()。stack`''是重要的部分。另外,问题提问者在他的问题中表示,他希望比node.js的答案更具通用性。因此上下文不限于node.js。比node.js更一般地,您可以通过Error()。stack来实现,并使用任何可用的功能打印其输出。Error()。stack`可以在任何JavaScript版本中使用,而console.trace()则不能。另外,如果您执行以下操作,则可以在node.js中使print工作:print = console.log。 (2认同)
  • 最后一句话是这个错误答案的全部原因:支持 ES5 或更高版本的_everything_支持 `console.trace()`,而你的答案显示的代码在任何浏览器中都不起作用,在 Node.js 中也不起作用 - 如果您想提及“new Error().stack”,然后务必将其作为第二部分添加到您的答案中。就目前情况而言,您发布的答案在任何常见的 JS 引擎中都不起作用,因此[是一个糟糕的答案](https://meta.stackexchange.com/questions/7656/how-do-i-write-a -问题的好答案)。首先记住为什么 SO 存在:如果答案有代码,那么代码应该可以工作 (2认同)

Lok*_*oki 6

文档说可以通过以下方式完成:

const targetObject = {};
Error.captureStackTrace(targetObject);
targetObject.stack;  // Similar to `new Error().stack`
Run Code Online (Sandbox Code Playgroud)

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