Node.js debugging

Stack overflows
It used to be hard to debug stack overflows in node, as it would just bomb without producing a stack trace. This has thankfully changed with node 0.11. It also helps to increase the stack depth to spot larger recursions:

$ node --stack-trace-limit=1000 

Chrome DevTools
See also: Debugging Node.js Nightlies with Chrome DevTools. Available as of Node v6.3.0. $ node --inspect script.js  To start debugging, open the following URL in Chrome: chrome-devtools://devtools/remote/serve_file/@../inspector.html?.. For command-line scripts that run immediately, you may want to use  so that you have an opportunity to start a Profile in the Dev Tools, for example. (Starting a CPU profiler will automatically resume script execution).

For services you'll usually want to omit   so that it won't time out when creating workers. Attach your debugger in Chrome, start a Profile, and then make requests to your service. Here's an example profiling Parsoid. We set worker count to 1 as each process gets its own debugger. $ node --inspect ./node_modules/.bin/service-runner -n 1 Debugger listening on port 9229. To start debugging, open the following URL in Chrome: chrome-devtools://devtools/remote/serve_file/@../inspector.html?..&ws=localhost:9229/node Debugger listening on port 5859. To start debugging, open the following URL in Chrome: chrome-devtools://devtools/remote/serve_file/@../inspector.html?..&ws=localhost:5859/node Made a request to "http://localhost:8000/localhost/v3/page/html/Main_Page" and stopped the debugger. Example flame chart: https://i.imgur.com/HshfDOx.png

Profiling
A good tool for profiling nodejs applications is the combination of nodegrind and kcachegrind.

Quick start:

$ npm install -g nodegrind $ nodegrind  Profile written to "callgrind.out.8004" Try `kcachegrind "callgrind.out.8004"` $ kcachegrind callgrind.out.8004