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

mik*_*ing 478 javascript stack-trace node.js

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

isa*_*acs 569

任何Error对象都有一个stack成员,它可以捕获构造它的点.

var stack = new Error().stack
console.log( stack )
Run Code Online (Sandbox Code Playgroud)

或更简单地说:

console.trace("Here I am!")
Run Code Online (Sandbox Code Playgroud)

  • console.log(err.stack)和console.trace()不会给你相同的结果.而err.stack为您提供了错误对象本身的堆栈跟踪(以我们通常认为的异常方式运行),console.trace()将在调用console.trace()的位置打印出调用堆栈.因此,如果您发现某些更深层代码抛出了一些错误,则console.trace()将不会在堆栈跟踪中包含更深层代码,因为该代码不再位于堆栈中.但是,console.log(err.stack)将包含更深层,只要它抛出一个Error对象. (119认同)
  • +1也显示`new Error().stack`,适用于您不想涉及控制台的情况. (12认同)
  • 截至目前,sys已被删除.它被''util'替换. (5认同)
  • 或者只是`sys.puts(new Error().stack)`(添加系统模块后) (2认同)

Mar*_*wak 186

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

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

  • 请务必注意关于`console.trace()`的[上述评论](http://stackoverflow.com/questions/2923858/how-to-print-a-stack-trace-in-nodejs#comment21085596_2932410). (11认同)
  • 默认情况下,这只会显示10帧,你可以使用命令行参数来增加它,例如`--stack_trace_limit = 200` (4认同)
  • 如果想输出到日志文件怎么办? (2认同)
  • 这似乎不适用于 Promise 和 async/await,不是吗? (2认同)

Zan*_*non 87

如前所述,您只需使用trace命令:

console.trace("I am here");
Run Code Online (Sandbox Code Playgroud)

但是,如果您在搜索有关如何记录异常的堆栈跟踪的问题时,可以只记录Exception对象.

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

} catch (e) {
  console.error(e);
}
Run Code Online (Sandbox Code Playgroud)

它会记录:

错误:发生了意外情况.
    at对象的主要(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) )
    在Module.load(module.js:355:32)
    的Function.Module._load(module.js:310:12)上,
    在Function.Module.runMain(module.js:501:10)
    启动时(node.js) :129:16)
    在node.js:814:3


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

[错误:发生意外事件.]

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


注意:如果将异常创建为类似字符串throw "myException",则无法检索堆栈跟踪并且记录e.stack产量未定义.

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

console.error(e.stack || e);
Run Code Online (Sandbox Code Playgroud)

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

  • 抱歉,我刚刚发现了一些重要的东西。请参阅我对相关帖子的评论:http://stackoverflow.com/questions/42528677/how-to-console-log-an-error-in-node-js/42538065#comment72263214_42532877。似乎单独记录错误确实显示了错误的全部内容,但尝试将它(如字符串)与其他文本连接起来只会导致使用简短的消息部分。有了这种认识,这一切都变得更有意义了。 (2认同)

ruX*_*ruX 37

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

console.log(ex, ex.stack.split("\n"));
Run Code Online (Sandbox Code Playgroud)

示例结果:

[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)' ]
Run Code Online (Sandbox Code Playgroud)


小智 10

在 v15.12.0 中,有多种方法可以执行此操作,

1. console.trace(anything)
2. Error.captureStackTrace(Object)
3. console.log(new Error().stack)
4. Try Catch - Use console.log(e), where `e` is catched by catch block
Run Code Online (Sandbox Code Playgroud)

或者更好地 在任何 Javascript 代码中使用stacktracejs


Tim*_*eau 9

通过一个随时可用的Node模块,可以从Node获得全长堆栈跟踪(尽管性能损失很小):http: //www.mattinsler.com/post/26396305882/announcing-longjohn-long-stack -traces换节点-JS

  • 链接无效,但可以仔细阅读[存档副本在此处](https://web.archive.org/web/20160309113159/http://www.mattinsler.com/post/26396305882/announcing-longjohn-long-stack-traces -for-nodejs)或签出[库](https://github.com/mattinsler/longjohn)。 (4认同)

Squ*_*les 6

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

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

   return err.stack;
}
Run Code Online (Sandbox Code Playgroud)

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

源代码:最近版本旧版本

  • getStack 未定义 (7认同)
  • 它不起作用,只显示当前行的堆栈(不是发生此错误的行)。`err.stack` 是更正确的答案。 (3认同)

Zhe*_*eng 5

尝试Error.captureStackTrace(targetObject[, constructorOpt])

const myObj = {};
function c() {
  // pass
}

function b() {
    Error.captureStackTrace(myObj)
    c()
} 

function a() {
    b()
}

a()

console.log(myObj.stack)
Run Code Online (Sandbox Code Playgroud)

函数ab被捕获在错误堆栈中并存储在myObj.

  • 如果您希望错误具有 `stack` 属性,则需要在 Node &gt;= 6 时调用它:`Error.captureStackTrace(error)`。 (2认同)