【问题标题】:More than 10 lines in a node.js stack error?node.js 堆栈错误超过 10 行?
【发布时间】:2021-01-06 21:41:50
【问题描述】:

有没有办法让 node.js 堆栈错误超过 10 行?

function a() { dieInHell(); }
function b() { a(); }
function c() { b(); }
function d() { c(); }
function e() { d(); }
function f() { e(); }
function g() { f(); }
function h() { g(); }
function i() { h(); }
function j() { i(); }
function k() { j(); }
function l() { k(); }
function m() { l(); }
function n() { m(); }
function o() { n(); }
function p() { o(); }
function q() { p(); }

try {
    q();
}
catch(e) {
    console.log(e.stack);
}

显示:

$ node debug.js 
ReferenceError: dieInHell is not defined
    at a (/Users/julien/tmp/debug.js:2:5)
    at b (/Users/julien/tmp/debug.js:6:5)
    at c (/Users/julien/tmp/debug.js:10:5)
    at d (/Users/julien/tmp/debug.js:14:5)
    at e (/Users/julien/tmp/debug.js:18:5)
    at f (/Users/julien/tmp/debug.js:22:5)
    at g (/Users/julien/tmp/debug.js:26:5)
    at h (/Users/julien/tmp/debug.js:30:5)
    at i (/Users/julien/tmp/debug.js:34:5)
    at j (/Users/julien/tmp/debug.js:38:5)

有没有办法获得超过 10 个电话?

【问题讨论】:

  • 更好的调试是 Node.JS 未来版本的优先事项
  • 我是否从您的评论中得知这还不能完成?
  • 不。但更好的调试在 .6 的列表中 :)

标签: node.js stack-trace


【解决方案1】:

最简单的解决方案是使用以下代码开始您的代码:

Error.stackTraceLimit = Infinity;

如果您想查看跨越 setTimeout/setInterval 调用的堆栈跟踪,那么更复杂的 https://github.com/mattinsler/longjohn 将是可行的方法。

【讨论】:

  • Error.stackTraceLimit 在我上次尝试时没有为我做。
  • 请注意,某些包可能会changestackTraceLimit。此外,它只会影响您在Error.stack 中看到的内容。内置调试器始终显示完整堆栈(bt 命令)。
  • 显然,堆栈跟踪不遵循异步操作。换句话说,在异步调用的回调中,您的堆栈从头开始(它基本上是空的)。
  • @x-yuri Node.js 团队正在努力解决这个问题 (github.com/nodejs/node/issues/11865) 否则,当您使用 --inspect--inpect-brk 命令运行 Node 应用程序时,Chrome 调试器中会显示完整堆栈
  • 天哪,这让我发疯了。感谢您提供此信息!
【解决方案2】:

您可以将堆栈跟踪限制作为命令行参数传递给node

node --stack-trace-limit=1000 debug.js // 默认 10

顺便说一句,另一件听起来不太可能发生但只是浪费了我几个小时进行调试的事情是堆栈大小(默认为 492 kB)。如果堆栈耗尽(RangeError 没有任何其他信息),您可能会遇到非常无信息的错误。 您可以使用增加堆栈大小:

node --stack-size=1024 debug.js // 默认 492

在回调到回调到回调链的世界中,如果程序没有考虑到这一点,实际上很容易超过大输入大小的堆栈大小。

要查看所有与堆栈相关的选项:

node --v8-options | grep -B0 -A1 stack

【讨论】:

  • --stack-trace-limit 自 0.10.22 起仍在工作,谢谢!
  • 从 Node.js v8.0.0 开始,您还可以在 NODE_OPTIONS 环境变量中设置它,例如NODE_OPTIONS='--stack-trace-limit=10000' /path/to/some-script。如果您不直接调用node,这很有用。
【解决方案3】:

【讨论】:

  • 希望 Node.js 最终默认集成这个!
【解决方案4】:

您可以在NODE_OPTIONS 变量内设置跟踪限制:

$ NODE_OPTIONS=--stack-trace-limit=100 node debug.js
ReferenceError: dieInHell is not defined
    at a (/tmp/debug.js:1:16)
    at b (/tmp/debug.js:2:16)
    at c (/tmp/debug.js:3:16)
    at d (/tmp/debug.js:4:16)
    at e (/tmp/debug.js:5:16)
    at f (/tmp/debug.js:6:16)
    at g (/tmp/debug.js:7:16)
    at h (/tmp/debug.js:8:16)
    at i (/tmp/debug.js:9:16)
    at j (/tmp/debug.js:10:16)
    at k (/tmp/debug.js:11:16)
    at l (/tmp/debug.js:12:16)
    at m (/tmp/debug.js:13:16)
    at n (/tmp/debug.js:14:16)
    at o (/tmp/debug.js:15:16)
    at p (/tmp/debug.js:16:16)
    at q (/tmp/debug.js:17:16)
    at Object.<anonymous> (/tmp/debug.js:20:5)
    at Module._compile (node:internal/modules/cjs/loader:1108:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1137:10)
    at Module.load (node:internal/modules/cjs/loader:973:32)
    at Function.Module._load (node:internal/modules/cjs/loader:813:14)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:76:12)
    at node:internal/main/run_main_module:17:47

【讨论】:

    【解决方案5】:

    您也可以使用built-in debugger,它会打开熟悉的 Google Chrome 开发工具调试器。它会在任何错误时停止,您可以浏览整个堆栈。运行:

    $ node --inspect debug.js
    
    Debugger listening on port 9229.
    To start debugging, open the following URL in Chrome: chrome-devtools://devtools/remote/serve_file/...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-04
      • 2018-08-05
      • 2018-12-08
      • 1970-01-01
      相关资源
      最近更新 更多