node.js堆栈中有10行以上的错误?


93

有没有一种方法可以使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未来版本的优先事项
BRampersad 2011年

我是否从您的评论中得知尚无法完成?
Julien Genestoux 2011年

不。但是.6列表上有更好的调试方法:)
BRampersad 2011年

Answers:


138

最简单的解决方案是使用以下代码启动代码:

Error.stackTraceLimit = Infinity;

如果您想查看跨越setTimeout / setInterval调用的堆栈跟踪,则可以使用更复杂的https://github.com/mattinsler/longjohn


2
我上次尝试时Error.stackTraceLimit没有为我做。
BT

请注意,某些软件包可能会更改 stackTraceLimit。而且,它只会影响您Error.stack从我看到的内容中获得的收益。内置调试器始终显示完整的堆栈(bt命令)。
x-yuri

显然,堆栈跟踪不会遵循异步操作。换句话说,在异步调用的回调中,您的堆栈从头开始(它基本上是空的)。
x-yuri

@ x-yuri Node.js团队正在努力解决这个问题(github.com/nodejs/node/issues/11865)否则,当您使用--inspect--inpect-brk命令运行Node applicaiton时,在Chrome调试器中可以看到完整的堆栈
Mariusz Nowak

天哪,这让我发疯。感谢您提供此信息!
克里斯·奥伊

65

您可以将堆栈跟踪限制作为命令行参数传递给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


3
--stack-trace-limit自0.10.22起仍然有效,谢谢!
Riplexus 2014年

3
从Node.js v8.0.0开始,您还可以在NODE_OPTIONS环境变量(例如)中进行设置NODE_OPTIONS='--stack-trace-limit=10000' /path/to/some-script。有用的,如果你不调用node直接。
Bluu


-1

您也可以使用内置的调试器,它会打开熟悉的Google Chrome浏览器的dev-tools调试器。它会在发生任何错误时停止,您可以浏览整个堆栈。赶紧跑:

$ node --inspect debug.js

Debugger listening on port 9229.
To start debugging, open the following URL in Chrome: chrome-devtools://devtools/remote/serve_file/...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.