Force Stack Traces with JavaScript
I recently inherited a Node.js project and man is that scary. The code was well written but whenever you inherit a project you instantly inherit the fear of messing things up. My goal was to fix a fairly routine bug, and finding the issue was fairly easy, but tracing through the code to figure out what called what and what passed what was a nightmare.
So I did the only thing I could do to figure out WTF was going on:
// The magic console.log(new Error().stack); /* SAMPLE: Error at Object.module.exports.request (/home/vagrant/src/kumascript/lib/kumascript/caching.js:366:17) at attempt (/home/vagrant/src/kumascript/lib/kumascript/loaders.js:180:24) at ks_utils.Class.get (/home/vagrant/src/kumascript/lib/kumascript/loaders.js:194:9) at /home/vagrant/src/kumascript/lib/kumascript/macros.js:282:24 at /home/vagrant/src/kumascript/node_modules/async/lib/async.js:118:13 at Array.forEach (native) at _each (/home/vagrant/src/kumascript/node_modules/async/lib/async.js:39:24) at Object.async.each (/home/vagrant/src/kumascript/node_modules/async/lib/async.js:117:9) at ks_utils.Class.reloadTemplates (/home/vagrant/src/kumascript/lib/kumascript/macros.js:281:19) at ks_utils.Class.process (/home/vagrant/src/kumascript/lib/kumascript/macros.js:217:15) */
Of course the actual "error" doesn't matter -- the stack trace is exactly what you need to figure out what's calling what up the chain. When available you can also use console.trace()
(when available) to achieve roughly the same output. You can thank me later!
How about
console.trace()
?console.trace()
doesn’t exist on Chrome on Android.How about node-inspector? It lets you use Chrome’s developer tools (sort of) to set breakpoints and inspect the code.
I’m not debugging any node project without it anymore!
Sounds like a perfect use case for spy-js – http://blog.jetbrains.com/webstorm/2014/08/tracing-debugging-and-profiling-node-js-with-spy-js/
Linked from JavaScript Daily. You can also use
node debug whatever.js
and put adebugger;
statement in the location you want to inspect. Then thebt
command will give you the trace.This is the solution I always use on my apps:
https://gist.github.com/Venerons/f54b7fbc17f9df4302cf
You can’t have more info than this. Really.
I used to just call an undefined function in order to make an error appear. Lazy means to the same end I’d say