Ошибка стека node.js более 10 строк?

95

Есть ли способ получить более 10 строк в ошибке стека node.js?

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 08
Могу ли я понять из вашего комментария, что это пока невозможно?
Жюльен Женесту 08
Неа. Но лучшая отладка находится в списке для .6 :)
BRampersad

Ответы:

144

Самое простое решение для этого - начать свой код со следующего:

Error.stackTraceLimit = Infinity;

Если вы хотите видеть трассировку стека, охватывающую вызовы setTimeout / setInterval, тогда вам подойдет более сложный https://github.com/mattinsler/longjohn .

Мариуш Новак
источник
2
Error.stackTraceLimit не помог мне, когда я в последний раз пытался.
BT
Обратите внимание, что некоторые пакеты могут измениться stackTraceLimit . Кроме того, это влияет только на то, что вы получаете Error.stackиз того, что я вижу. Встроенный отладчик всегда отображает полный стек ( btкоманду).
x-
И, очевидно, трассировка стека не следует за асинхронными операциями. Другими словами, при обратном вызове асинхронного вызова ваш стек запускается с нуля (в основном он пуст).
x-
Команда @ x-yuri Node.js работает над этим ( github.com/nodejs/node/issues/11865 ) В противном случае полный стек будет виден в отладчике Chrome, когда вы запускаете приложение Node с помощью команды --inspectили--inpect-brk
Мариуш Новак
Боже, это сводило меня с ума. Спасибо за эту информацию!
Kris Oye
65

Вы можете передать ограничение трассировки стека в качестве параметра командной строки node:

node --stack-trace-limit=1000 debug.js // по умолчанию 10

Кстати, еще одна вещь, которая кажется маловероятной, но я просто потратил несколько часов на отладку, - это размер стека (который по умолчанию составляет 492 КБ) . Если стек исчерпан ( RangeErrorбез дополнительной информации), могут возникнуть очень неинформативные ошибки . Вы можете увеличить размер стека с помощью :

node --stack-size=1024 debug.js // по умолчанию 492

В мире цепочек обратный вызов-обратный вызов-обратный вызов на самом деле очень легко превысить размер стека для больших размеров ввода, если программа не написана с учетом этого.

Чтобы увидеть все параметры, связанные со стеком:

node --v8-options | grep -B0 -A1 stack

jakub.g
источник
3
--stack-trace-limit все еще работает с 0.10.22, спасибо!
Riplexus
3
Начиная с Node.js v8.0.0, вы также можете установить это в NODE_OPTIONSпеременной среды, например NODE_OPTIONS='--stack-trace-limit=10000' /path/to/some-script. Полезно, если вы не вызываете nodeнапрямую.
Bluu
-1

Также вы можете использовать встроенный отладчик , который открывает знакомый отладчик инструментов разработчика Google Chrome. Он останавливается при любой ошибке, и вы можете просмотреть весь стек. Просто беги:

$ node --inspect debug.js

Debugger listening on port 9229.
To start debugging, open the following URL in Chrome: chrome-devtools://devtools/remote/serve_file/...
Zbycz
источник