Mehr als 10 Zeilen in einem node.js-Stapelfehler?


93

Gibt es eine Möglichkeit, mehr als 10 Zeilen in einem Node.js-Stack-Fehler abzurufen?

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);
}

zeigt an :

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

Gibt es eine Möglichkeit, mehr als 10 Anrufe zu erhalten?


Besseres Debuggen ist eine Priorität für die zukünftigen Versionen von Node.JS
BRampersad

Nehme ich aus Ihrem Kommentar, dass dies noch nicht möglich ist?
Julien Genestoux

Nee. Aber besseres Debuggen ist auf der Liste für .6 :)
BRampersad

Antworten:


138

Die einfachste Lösung dafür besteht darin, den Code wie folgt zu starten:

Error.stackTraceLimit = Infinity;

Wenn Sie einen Stack-Trace sehen möchten, der sich über setTimeout / setInterval-Aufrufe erstreckt, ist anspruchsvollere https://github.com/mattinsler/longjohn der richtige Weg.


2
Error.stackTraceLimit hat es nicht für mich getan, als ich es das letzte Mal versucht habe.
BT

Beachten Sie, dass sich einige Pakete möglicherweise ändern stackTraceLimit . Außerdem betrifft es nur das, was Sie von dem bekommen, Error.stackwas ich sehen kann. Der eingebaute Debugger zeigt immer den vollen Stapel an ( btBefehl).
X-Yuri

Und anscheinend folgt die Stapelverfolgung keinen asynchronen Operationen. Mit anderen Worten, bei einem Rückruf eines asynchronen Aufrufs beginnt Ihr Stapel von vorne (er ist im Grunde genommen leer).
X-Yuri

@ x-yuri Node.js Team arbeitet daran ( github.com/nodejs/node/issues/11865 ) Andernfalls ist der vollständige Stapel im Chrome-Debugger sichtbar, wenn Sie die Node-Anwendung mit --inspectoder dem --inpect-brkBefehl ausführen
Mariusz Nowak

Omg das hat mich verrückt gemacht. Danke für diese Info!
Kris Oye

65

Sie können das Stack-Trace-Limit als Befehlszeilenparameter an übergeben node :

node --stack-trace-limit=1000 debug.js // Standard 10

Übrigens, eine andere Sache, die unwahrscheinlich klingt, aber nur ein paar Stunden meiner Zeit für das Debuggen verschwendet hat, ist die Stapelgröße (standardmäßig 492 kB) . Sie können sehr uninformative Fehler haben, wenn der Stapel erschöpft ist ( RangeErrorohne zusätzliche Informationen). Sie können die Stapelgröße mit erhöhen :

node --stack-size=1024 debug.js // Standard 492

In der Welt der Callback-to-Callback-to-Callback-Verkettungen ist es in der Tat sehr einfach, die Stapelgröße für große Eingabegrößen zu überschreiten, wenn das Programm nicht in diesem Sinne geschrieben ist.

So zeigen Sie alle stapelbezogenen Optionen an:

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


3
--stack-trace-limit funktioniert noch ab 0.10.22, danke!
Riplexus

3
Ab Node.js v8.0.0 können Sie dies auch in der NODE_OPTIONSUmgebungsvariablen festlegen , z NODE_OPTIONS='--stack-trace-limit=10000' /path/to/some-script. Nützlich, wenn Sie nicht nodedirekt aufrufen .
Bluu


-1

Sie können auch den integrierten Debugger verwenden , der den bekannten Debugger für Entwicklertools von Google Chrome öffnet. Es stoppt bei jedem Fehler und Sie können den gesamten Stapel durchsuchen. Renn einfach:

$ node --inspect debug.js

Debugger listening on port 9229.
To start debugging, open the following URL in Chrome: chrome-devtools://devtools/remote/serve_file/...
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.