2017-09-03 3 views
1

Beim Debuggen Node.js Code, den ich oft auf Anruf-Stacks, die mein Programm den Code nicht in ihnen enthalten, node_modules nur/nicht-Benutzercode, trotz der aktuellen Zeile der Ausführung wird bei ein Ort in meinem Code. Dies verhindert den Zweck, dem Aufrufstapel zu folgen, um den Ausführungspfad durch meinen Anwendungscode zu sehen.Node.js stacktraces enthalten keine Benutzercode

Warum in den Call-Stack werden meine Quelldateien nicht?

Full stacktrace

+0

könnte ich ahne, dass Sie bei einem asynchronen Stack-Trace sind, wo der Code nicht in dem Stapel mit Ausnahme für den Rückruf ist, weil Ihr Code abgewickelt/beendet und dann wurde der Asynchron-Rückruf aufgerufen. – jfriend00

+0

Gibt es einen Weg, dass ich dies bestätigen kann, ist das tatsächlich das Problem? Ich benutze Versprechungen und gebe alle zu ihren Elternversprechen zurück, also würde ich erwarten, dass es eine ununterbrochene Anruf-Ablaufverfolgung vom ursprünglichen Quellcode zum Haltepunkt gibt. – sabrehagen

+0

Alle '.then()' Handler für alle Versprechen werden asynchron mit einem sauberen Stapel aufgerufen. Das ist nach der Spezifikation des Versprechens. Also, Versprechungen lassen immer den aktuellen Thread der Ausführung beenden und abwickeln und dann feuern '.then()' Handler ohne Benutzercode auf den Stack, wenn der Callback aufgerufen wird. Was Sie beschreiben, ist, wie synchrone Code funktionieren würde, nicht asynchroner Code. Wir könnten viel spezifischer statt theoretisch sprechen, wenn Sie tatsächlichen Code zeigen und beschreiben, wo Sie den Call-Stack betrachten. – jfriend00

Antwort

3

Es scheint, dass Sie bei einem asynchronen Stack-Trace sind, wo Ihr Code aufgerufen nicht in dem Stapel mit Ausnahme für den Rückruf, weil Ihr Code abgewickelt/fertigt und dann der Asynchron Rückruf wurde ist.

Alle .then()-Handler für alle Versprechen werden asynchron mit einem sauberen Stapel bezeichnet. Das ist nach der Spezifikation des Versprechens. So verspricht immer den aktuellen Thread der Ausführung ausreden und entspannen und dann feuern sie .then() Handler ohne Benutzercode auf dem Stapel, wenn der Rückruf aufgerufen wird. Was Sie beschreiben, ist, wie synchrone Code funktionieren würde, nicht asynchroner Code. Wir könnten viel spezifischer statt theoretisch sprechen, wenn Sie tatsächlichen Code zeigen und beschreiben, wo Sie den Call-Stack betrachten.

Async Fortschritt hat oft mit der Protokollierung verfolgt werden, weil sie nicht so leicht durch sie treten kann und man kann nicht einfach brechen und zwar sowohl bei Stack-Traces aus.

Als ein wenig einfacheres Beispiel zu betrachten:

function foo() { 
    setTimeout(() => { 
     console.log("timer"); // set breakpoint here 
    }, 100); 
} 

foo(); 

Die Funktion foo() hat die Ausführung beendet und kehrte vor dem Rückruf aufgerufen wird und damit der Stack-Trace wird nicht von Ihrem Code (andere als nur die Rückruf) darauf.

Während .then() Handler einen etwas anderen Scheduler als setTimeout() verwenden, ist das Prinzip das gleiche.