如何在 Node.js 中打印堆栈跟踪?

IT技术 javascript node.js stack-trace
2021-01-15 16:49:13

有谁知道如何在 Node.js 中打印堆栈跟踪?

6个回答

任何Error对象都有一个stack成员来捕获它的构造点。

var stack = new Error().stack
console.log( stack )

或更简单地说:

console.trace("Here I am!")
+1 也显示new Error().stack,这适用于您不想涉及控制台的情况。
2021-03-13 16:49:13
console.log(err.stack) 和 console.trace() 不会给你相同的结果。err.stack 为您提供 err 对象本身的堆栈跟踪(以我们通常认为的异常的方式运行),console.trace() 将在调用 console.trace() 的地方打印出调用堆栈。因此,如果您发现某个更深层代码抛出的错误,则 console.trace() 将不会在堆栈跟踪中包含该更深层代码,因为该代码不再位于堆栈中。然而,console.log(err.stack) 将包含更深的层,只要它抛出一个 Error 对象。
2021-03-30 16:49:13
的一个优点trace是它也显示当前行/上下文,而stack没有。如果您想手动创建该行,我猜该信息在错误对象中。
2021-04-05 16:49:13
或者只是sys.puts(new Error().stack)(在添加系统module后)
2021-04-08 16:49:13
截至目前, sys 已被弃用。它被替换为'util'
2021-04-12 16:49:13

现在控制台上有一个专门的功能

console.trace()
只要确保注意上面关于console.trace().
2021-03-13 16:49:13
这似乎不适用于 promises 和 async/await,是吗?
2021-03-28 16:49:13
默认情况下,这只会显示 10 帧,您可以使用命令行参数来增加它,例如 --stack_trace_limit=200
2021-04-01 16:49:13
如果要输出到日志文件怎么办?
2021-04-06 16:49:13

正如已经回答的那样,您可以简单地使用trace命令:

console.trace("I am here");

但是,如果您遇到这个问题是为了搜索如何记录异常的堆栈跟踪,您可以简单地记录 Exception 对象。

try {  
  // if something unexpected
  throw new Error("Something unexpected has occurred.");     

} catch (e) {
  console.error(e);
}

它会记录:

错误:发生了意外。
    在主要 (c:\Users\Me\Documents\MyApp\app.js:9:15)
    在对象。(c:\Users\Me\Documents\MyApp\app.js:17:1)
    在 Module._compile (module.js:460:26)
    在 Object.Module._extensions..js (module.js:478:10) )
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at start (node.js) :129:16)
    在 node.js:814:3


如果您的 Node.js 版本 < 6.0.0,则记录 Exception 对象是不够的。在这种情况下,它只会打印:

[错误:发生了意外。]

对于 Node 版本 < 6,使用console.error(e.stack)而不是console.error(e)打印错误消息和完整堆栈,就像当前的 Node 版本一样。


注意:如果异常被创建为类似的字符串throw "myException",则无法检索堆栈跟踪并且日志记录会e.stack产生undefined

为了安全起见,您可以使用

console.error(e.stack || e);

它适用于新旧 Node.js 版本。

抱歉,我刚刚发现了一些重要的东西。见我对相关的评论:stackoverflow.com/questions/42528677/...似乎自行记录错误确实显示了错误的全部内容,但尝试将它(如字符串)与其他文本连接起来只会导致使用简短的消息部分。有了这种认识,这一切都变得更有意义了。
2021-03-15 16:49:13
@drmrbrewer 确认此行为在 6.0.0 版上发生了变化
2021-03-22 16:49:13
@drmrbrewer,感谢您指出这一点。Node 版本 4.x 和 7.x 之间的行为似乎发生了变化(可能是 V8 的变化)。我已经更新了我的答案。
2021-03-25 16:49:13
不会console.error(e)打印所有e对象,包括e.stack
2021-03-27 16:49:13
你拯救了我的一天)
2021-03-31 16:49:13

Error以更易读的方式在控制台中打印堆栈跟踪

console.log(ex, ex.stack.split("\n"));

结果示例:

[Error] [ 'Error',
  '    at repl:1:7',
  '    at REPLServer.self.eval (repl.js:110:21)',
  '    at Interface.<anonymous> (repl.js:239:12)',
  '    at Interface.EventEmitter.emit (events.js:95:17)',
  '    at Interface._onLine (readline.js:202:10)',
  '    at Interface._line (readline.js:531:8)',
  '    at Interface._ttyWrite (readline.js:760:14)',
  '    at ReadStream.onkeypress (readline.js:99:10)',
  '    at ReadStream.EventEmitter.emit (events.js:98:17)',
  '    at emitKey (readline.js:1095:12)' ]

@isaacs答案是正确的,但如果您需要更具体或更清晰的错误堆栈,您可以使用此功能:

function getCleanerStack() {
   var err = new Error();
   Error.captureStackTrace(err, getStack);

   return err.stack;
}

这个函数的灵感直接来自NodeJS 中console.trace函数

源代码:最近版本旧版本

getStack 未定义
2021-03-13 16:49:13
它不起作用,只显示当前行的堆栈(不是发生此错误的行)。err.stack是更正确的答案。
2021-03-31 16:49:13