Deep stack traces based on AsyncListener API
You know the drill
npm i asynctrace --save-dev
// simply require, somewhere near the process entry point
require('asynctrace')
specificaly made compatible with mocha
mocha --require asynctrace
for this code:
'use strict';
require('asynctrace')
setImmediate(function a() {
setImmediate(function b() {
setImmediate(function c() {
setImmediate(function d() {
setImmediate(function e() {
throw new Error('gaga');
});
});
});
});
});
You'll get the following stack trace:
throw new Error('gaga');
^
Error: gaga
at Immediate.e [as _onImmediate] (C:\projects\trowExample\trowwer.js:9:27)
at processImmediate [as _immediateCallback] (timers.js:374:17)
- - - - - - async boundary - - - - - -
at Immediate.d [as _onImmediate] (C:\projects\trowExample\trowwer.js:8:17)
- - - - - - async boundary - - - - - -
at Immediate.c [as _onImmediate] (C:\projects\trowExample\trowwer.js:7:13)
- - - - - - async boundary - - - - - -
at Immediate.b [as _onImmediate] (C:\projects\trowExample\trowwer.js:6:9)
- - - - - - async boundary - - - - - -
at Immediate.a [as _onImmediate] (C:\projects\trowExample\trowwer.js:5:5)
- - - - - - async boundary - - - - - -
at Object.<anonymous> (C:\projects\trowExample\trowwer.js:4:1)
- - - - - - async boundary - - - - - -
There is a performance price with using AsyncListner, but we were able to minimize it. For example here are timing on running the full visionmedia/express test suite:
[10:50:28 /empeeric/3party/express] time mocha --require asynctrace --require test/support/env --reporter dot --check-leaks test/ test/acceptance/
..................................................................
513 passing (7s)
real 0m8.061s
user 0m0.045s
sys 0m0.075s
[10:50:41 /empeeric/3party/express] time mocha --require test/support/env --reporter dot --check-leaks test/ test/acceptance/
..................................................................
513 passing (5s)
real 0m6.314s
user 0m0.030s
sys 0m0.075s