Więcej niż 10 wierszy w błędzie stosu node.js?

94

Czy istnieje sposób, aby uzyskać więcej niż 10 wierszy w błędzie stosu 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);
}

przedstawia :

$ 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)

Czy jest sposób, aby uzyskać więcej niż 10 połączeń?

Julien Genestoux
źródło
Lepsze debugowanie jest priorytetem dla przyszłych wersji Node.JS
BRampersad
Czy z twojego komentarza wynika, że ​​nie można tego jeszcze zrobić?
Julien Genestoux
Nie. Ale lepsze debugowanie jest na liście dla .6 :)
BRampersad

Odpowiedzi:

143

Najłatwiejszym rozwiązaniem jest uruchomienie kodu w następujący sposób:

Error.stackTraceLimit = Infinity;

Jeśli chcesz zobaczyć ślad stosu, który obejmuje wywołania setTimeout / setInterval, bardziej wyrafinowany https://github.com/mattinsler/longjohn byłby drogą do zrobienia.

Mariusz Nowak
źródło
2
Error.stackTraceLimit nie zrobił tego za mnie, kiedy ostatnio próbowałem.
BT
Zauważ, że niektóre pakiety mogą się zmienić stackTraceLimit . Poza tym wpływa tylko na to, Error.stackco widzę. Wbudowany debugger zawsze wyświetla pełny stos ( btpolecenie).
x-yuri
I najwyraźniej śledzenie stosu nie następuje po operacjach asynchronicznych. Innymi słowy, w wywołaniu zwrotnym wywołania asynchronicznego, twój stos zaczyna się od zera (jest w zasadzie pusty).
x-yuri
Zespół @ x-yuri Node.js pracuje nad tym ( github.com/nodejs/node/issues/11865 ) W przeciwnym razie pełny stos jest widoczny w debugerze Chrome po uruchomieniu aplikacji Node za pomocą polecenia --inspectlub--inpect-brk
Mariusz Nowak
O mój Boże, to doprowadzało mnie do szału. Dzięki za te informacje!
Kris Oye
65

Możesz przekazać limit śledzenia stosu jako parametr wiersza poleceń do node:

node --stack-trace-limit=1000 debug.js // domyślnie 10

Przy okazji, kolejną rzeczą, która wydaje się mało prawdopodobna, ale straciłem kilka godzin mojego czasu na debugowanie, jest rozmiar stosu (który domyślnie wynosi 492 kB) . Możesz mieć bardzo nieinformacyjne błędy, jeśli stos jest wyczerpany ( RangeErrorbez żadnych dodatkowych informacji). Możesz zwiększyć rozmiar stosu za pomocą :

node --stack-size=1024 debug.js // domyślnie 492

W świecie łańcuchów wywołań zwrotnych do wywołań zwrotnych do wywołań zwrotnych w rzeczywistości bardzo łatwo jest przekroczyć rozmiar stosu dla dużych rozmiarów danych wejściowych, jeśli program nie jest o tym napisany.

Aby zobaczyć wszystkie opcje związane ze stosem:

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

jakub.g
źródło
3
--stack-trace-limit nadal działa od 0.10.22, dzięki!
Riplexus
3
Począwszy od Node.js v8.0.0, możesz to również ustawić w NODE_OPTIONSzmiennej środowiskowej, np NODE_OPTIONS='--stack-trace-limit=10000' /path/to/some-script. Przydatne, jeśli nie wywołujesz nodebezpośrednio.
Bluu
-1

Możesz także użyć wbudowanego debuggera , który otwiera znany debugger narzędzi programistycznych Google Chrome. Zatrzymuje się przy każdym błędzie i możesz przeglądać cały stos. Po prostu biegnij:

$ 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
źródło