Debugger
[Stabil: 2 - Stabil]
Stabil: 2 Stabilität: 2 - Stabil
Node.js enthält ein Befehlszeilen-Debug-Dienstprogramm. Der Node.js-Debugger-Client ist kein voll funktionsfähiger Debugger, aber einfaches Stepping und Inspektion sind möglich.
Zur Verwendung starten Sie Node.js mit dem Argument inspect
, gefolgt vom Pfad zum zu debugenden Skript.
$ node inspect myscript.js
< Debugger listening on ws://127.0.0.1:9229/621111f9-ffcb-4e82-b718-48a145fa5db8
< For help, see: https://nodejs.org/en/docs/inspector
<
connecting to 127.0.0.1:9229 ... ok
< Debugger attached.
<
ok
Break on start in myscript.js:2
1 // myscript.js
> 2 global.x = 5;
3 setTimeout(() => {
4 debugger;
debug>
Der Debugger unterbricht automatisch in der ersten ausführbaren Zeile. Um stattdessen bis zum ersten Breakpoint (angegeben durch eine debugger
Anweisung) zu laufen, setzen Sie die Umgebungsvariable NODE_INSPECT_RESUME_ON_START
auf 1
.
$ cat myscript.js
// myscript.js
global.x = 5;
setTimeout(() => {
debugger;
console.log('world');
}, 1000);
console.log('hello');
$ NODE_INSPECT_RESUME_ON_START=1 node inspect myscript.js
< Debugger listening on ws://127.0.0.1:9229/f1ed133e-7876-495b-83ae-c32c6fc319c2
< For help, see: https://nodejs.org/en/docs/inspector
<
connecting to 127.0.0.1:9229 ... ok
< Debugger attached.
<
< hello
<
break in myscript.js:4
2 global.x = 5;
3 setTimeout(() => {
> 4 debugger;
5 console.log('world');
6 }, 1000);
debug> next
break in myscript.js:5
3 setTimeout(() => {
4 debugger;
> 5 console.log('world');
6 }, 1000);
7 console.log('hello');
debug> repl
Press Ctrl+C to leave debug repl
> x
5
> 2 + 2
4
debug> next
< world
<
break in myscript.js:6
4 debugger;
5 console.log('world');
> 6 }, 1000);
7 console.log('hello');
8
debug> .exit
$
Der Befehl repl
erlaubt die ferne Auswertung von Code. Der Befehl next
geht zur nächsten Zeile. Geben Sie help
ein, um zu sehen, welche anderen Befehle verfügbar sind.
Durch Drücken von Enter
ohne Eingabe eines Befehls wird der vorherige Debugger-Befehl wiederholt.
Beobachter
Während des Debuggens ist es möglich, Ausdrücke und Variablenwerte zu beobachten. An jedem Breakpoint wird jeder Ausdruck aus der Beobachterliste im aktuellen Kontext ausgewertet und unmittelbar vor der Quellcodeauflistung des Breakpoints angezeigt.
Um einen Ausdruck zu beobachten, geben Sie watch('my_expression')
ein. Der Befehl watchers
gibt die aktiven Beobachter aus. Um einen Beobachter zu entfernen, geben Sie unwatch('my_expression')
ein.
Befehlsreferenz
Schrittschaltung
cont
,c
: Ausführung fortsetzennext
,n
: Nächster Schrittstep
,s
: Schritt hineinout
,o
: Schritt herauspause
: Laufenden Code anhalten (wie die Pause-Schaltfläche in den Entwicklertools)
Breakpoints
setBreakpoint()
,sb()
: Breakpoint in der aktuellen Zeile setzensetBreakpoint(line)
,sb(line)
: Breakpoint in einer bestimmten Zeile setzensetBreakpoint('fn()')
,sb(...)
: Breakpoint an der ersten Anweisung im Funktionskörper setzensetBreakpoint('script.js', 1)
,sb(...)
: Breakpoint in der ersten Zeile vonscript.js
setzensetBreakpoint('script.js', 1, 'num < 4')
,sb(...)
: Bedingten Breakpoint in der ersten Zeile vonscript.js
setzen, der nur unterbricht, wennnum < 4
zutrue
ausgewertet wirdclearBreakpoint('script.js', 1)
,cb(...)
: Breakpoint inscript.js
in Zeile 1 löschen
Es ist auch möglich, einen Breakpoint in einer Datei (Modul) zu setzen, die noch nicht geladen ist:
$ node inspect main.js
< Debugger listening on ws://127.0.0.1:9229/48a5b28a-550c-471b-b5e1-d13dd7165df9
< For help, see: https://nodejs.org/en/docs/inspector
<
connecting to 127.0.0.1:9229 ... ok
< Debugger attached.
<
Break on start in main.js:1
> 1 const mod = require('./mod.js');
2 mod.hello();
3 mod.hello();
debug> setBreakpoint('mod.js', 22)
Warning: script 'mod.js' was not loaded yet.
debug> c
break in mod.js:22
20 // USE OR OTHER DEALINGS IN THE SOFTWARE.
21
>22 exports.hello = function() {
23 return 'hello from module';
24 };
debug>
Es ist auch möglich, einen bedingten Breakpoint zu setzen, der nur unterbricht, wenn ein gegebener Ausdruck zu true
ausgewertet wird:
$ node inspect main.js
< Debugger listening on ws://127.0.0.1:9229/ce24daa8-3816-44d4-b8ab-8273c8a66d35
< For help, see: https://nodejs.org/en/docs/inspector
<
connecting to 127.0.0.1:9229 ... ok
< Debugger attached.
Break on start in main.js:7
5 }
6
> 7 addOne(10);
8 addOne(-1);
9
debug> setBreakpoint('main.js', 4, 'num < 0')
1 'use strict';
2
3 function addOne(num) {
> 4 return num + 1;
5 }
6
7 addOne(10);
8 addOne(-1);
9
debug> cont
break in main.js:4
2
3 function addOne(num) {
> 4 return num + 1;
5 }
6
debug> exec('num')
-1
debug>
Informationen
backtrace
,bt
: Gibt den Backtrace des aktuellen Ausführungsframes auslist(5)
: Listet den Quellcode der Skripte mit 5 Zeilen Kontext (5 Zeilen vor und nach)watch(expr)
: Fügt einen Ausdruck zur Watch-Liste hinzuunwatch(expr)
: Entfernt einen Ausdruck aus der Watch-Listeunwatch(index)
: Entfernt einen Ausdruck an einem bestimmten Index aus der Watch-Listewatchers
: Listet alle Watcher und ihre Werte auf (automatisch bei jedem Breakpoint aufgelistet)repl
: Öffnet die REPL des Debuggers zur Auswertung im Kontext des Debugging-Skriptsexec expr
,p expr
: Führt einen Ausdruck im Kontext des Debugging-Skripts aus und gibt seinen Wert ausprofile
: Startet eine CPU-Profiling-SitzungprofileEnd
: Stoppt die aktuelle CPU-Profiling-Sitzungprofiles
: Listet alle abgeschlossenen CPU-Profiling-Sitzungen aufprofiles[n].save(filepath = 'node.cpuprofile')
: Speichert die CPU-Profiling-Sitzung als JSON auf der FestplattetakeHeapSnapshot(filepath = 'node.heapsnapshot')
: Erstellt eine Heapshot und speichert sie als JSON auf der Festplatte
Ausführungssteuerung
run
: Führt das Skript aus (wird automatisch beim Start des Debuggers ausgeführt)restart
: Startet das Skript neukill
: Beendet das Skript
Verschiedenes
scripts
: Listet alle geladenen Skripte aufversion
: Zeigt die V8-Version an
Erweiterte Verwendung
V8 Inspector Integration für Node.js
Die V8 Inspector Integration ermöglicht das Anfügen von Chrome DevTools an Node.js-Instanzen zum Debuggen und Profilieren. Sie verwendet das Chrome DevTools Protocol.
Die V8 Inspector Integration kann durch Übergabe des Flags --inspect
beim Starten einer Node.js-Anwendung aktiviert werden. Es ist auch möglich, einen benutzerdefinierten Port mit diesem Flag anzugeben, z. B. --inspect=9222
akzeptiert DevTools-Verbindungen am Port 9222.
Die Verwendung des Flags --inspect
führt den Code sofort aus, bevor der Debugger verbunden wird. Das bedeutet, dass der Code gestartet wird, bevor Sie mit dem Debuggen beginnen können, was möglicherweise nicht ideal ist, wenn Sie von Anfang an debuggen möchten.
In solchen Fällen haben Sie zwei Alternativen:
Daher sollten Sie bei der Entscheidung zwischen --inspect
, --inspect-wait
und --inspect-brk
berücksichtigen, ob der Code sofort ausgeführt werden soll, auf die Anbindung des Debuggers vor der Ausführung gewartet werden soll oder ob im ersten Schritt eine Schritt-für-Schritt-Fehlerbehebung erfolgen soll.
$ node --inspect index.js
Debugger listening on ws://127.0.0.1:9229/dc9010dd-f8b8-4ac5-a510-c1a114ec7d29
For help, see: https://nodejs.org/en/docs/inspector
(Im obigen Beispiel wird die UUID dc9010dd-f8b8-4ac5-a510-c1a114ec7d29 am Ende der URL dynamisch generiert und variiert in verschiedenen Debugsitzungen.)
Wenn der Chrome-Browser älter als 66.0.3345.0 ist, verwenden Sie inspector.html
anstelle von js_app.html
in der obigen URL.
Chrome DevTools unterstützt das Debuggen von Worker-Threads noch nicht. ndb kann zum Debuggen verwendet werden.