Is there a way to get more than 10 lines in a node.js stack error?
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);
}
shows :
$ 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)
Is there a way to get more than 10 calls?
Easiest solution for that is to start your code with following:
Error.stackTraceLimit = Infinity;
If you'd like to see stack trace that spans over setTimeout/setInterval calls, then more sophisticated https://github.com/mattinsler/longjohn would be the way to go.
You can pass stack trace limit as a command line param to node
:
node --stack-trace-limit=1000 debug.js
// default 10
BTW, another thing which sounds unlikely to happen, but just wasted a few hours of my time for debugging, is the stack size (which defaults to 492 kB). You can have very uninformative errors if the stack is exhausted (RangeError
without any additional info). You can increase the stack size with:
node --stack-size=1024 debug.js
// default 492
In the world of callback-to-callback-to-callback chainings, it's in fact very easy to exceed the stack size for big input sizes, if the program is not written in this in mind.
To see all stack-related options:
node --v8-options | grep -B0 -A1 stack
You can set the trace limit within NODE_OPTIONS
variable:
$ 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
Use the https://github.com/tlrobinson/long-stack-traces module.
Also you can use built-in debugger, which opens familiar Google Chrome's dev-tools debugger. It stops on any error and you can browse the whole stack. Just run:
$ node --inspect debug.js
Debugger listening on port 9229.
To start debugging, open the following URL in Chrome: chrome-devtools://devtools/remote/serve_file/...
精彩评论