Depurador
[Estable: 2 - Estable]
Estable: 2 Estabilidad: 2 - Estable
Node.js incluye una utilidad de depuración en línea de comandos. El cliente del depurador de Node.js no es un depurador con todas las funciones, pero se puede realizar una inspección y un paso a paso simples.
Para usarlo, inicie Node.js con el argumento inspect
seguido de la ruta al script que desea depurar.
$ node inspect myscript.js
< Debugger listening on ws://127.0.0.1:9229/621111f9-ffcb-4e82-b718-48a145fa5db8
< Para obtener ayuda, consulte: 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>
El depurador se interrumpe automáticamente en la primera línea ejecutable. Para ejecutar en su lugar hasta el primer punto de interrupción (especificado mediante una instrucción debugger
), establezca la variable de entorno NODE_INSPECT_RESUME_ON_START
en 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
< Para obtener ayuda, consulte: 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
$
El comando repl
permite evaluar código de forma remota. El comando next
avanza a la siguiente línea. Escriba help
para ver qué otros comandos están disponibles.
Presionar enter
sin escribir un comando repetirá el comando del depurador anterior.
Observadores
Es posible observar los valores de expresiones y variables durante la depuración. En cada punto de interrupción, cada expresión de la lista de observadores se evaluará en el contexto actual y se mostrará inmediatamente antes del listado del código fuente del punto de interrupción.
Para comenzar a observar una expresión, escriba watch('my_expression')
. El comando watchers
imprimirá los observadores activos. Para eliminar un observador, escriba unwatch('my_expression')
.
Referencia de comandos
Avance paso a paso
cont
,c
: Continuar la ejecuciónnext
,n
: Paso siguientestep
,s
: Paso dentroout
,o
: Paso fuerapause
: Pausar el código en ejecución (como el botón de pausa en las Herramientas para desarrolladores)
Puntos de interrupción
setBreakpoint()
,sb()
: Establecer punto de interrupción en la línea actualsetBreakpoint(line)
,sb(line)
: Establecer punto de interrupción en una línea específicasetBreakpoint('fn()')
,sb(...)
: Establecer punto de interrupción en la primera instrucción del cuerpo de la funciónsetBreakpoint('script.js', 1)
,sb(...)
: Establecer punto de interrupción en la primera línea descript.js
setBreakpoint('script.js', 1, 'num < 4')
,sb(...)
: Establecer punto de interrupción condicional en la primera línea descript.js
que solo se interrumpe cuandonum < 4
se evalúa comotrue
clearBreakpoint('script.js', 1)
,cb(...)
: Borrar punto de interrupción enscript.js
en la línea 1
También es posible establecer un punto de interrupción en un archivo (módulo) que aún no se ha cargado:
$ 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>
También es posible establecer un punto de interrupción condicional que solo se interrumpe cuando una expresión dada se evalúa como true
:
$ 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>
Información
backtrace
,bt
: Imprimir el rastreo de la pila del marco de ejecución actuallist(5)
: Listar el código fuente de los scripts con contexto de 5 líneas (5 líneas antes y después)watch(expr)
: Agregar una expresión a la lista de seguimientounwatch(expr)
: Eliminar una expresión de la lista de seguimientounwatch(index)
: Eliminar una expresión de la lista de seguimiento en un índice específicowatchers
: Listar todos los elementos de seguimiento y sus valores (se listan automáticamente en cada punto de interrupción)repl
: Abrir el repl del depurador para la evaluación en el contexto del script de depuraciónexec expr
,p expr
: Ejecutar una expresión en el contexto del script de depuración e imprimir su valorprofile
: Iniciar una sesión de perfilado de CPUprofileEnd
: Detener la sesión de perfilado de CPU actualprofiles
: Listar todas las sesiones de perfilado de CPU completadasprofiles[n].save(filepath = 'node.cpuprofile')
: Guardar la sesión de perfilado de CPU en el disco como JSONtakeHeapSnapshot(filepath = 'node.heapsnapshot')
: Tomar una instantánea de montón y guardarla en el disco como JSON
Control de ejecución
run
: Ejecutar script (se ejecuta automáticamente al iniciar el depurador)restart
: Reiniciar scriptkill
: Matar script
Varios
scripts
: Lista todos los scripts cargadosversion
: Muestra la versión de V8
Uso avanzado
Integración del inspector V8 para Node.js
La integración del inspector V8 permite conectar Chrome DevTools a instancias de Node.js para depurar y perfilar. Utiliza el Protocolo Chrome DevTools.
El inspector V8 se puede habilitar pasando la bandera --inspect
al iniciar una aplicación Node.js. También es posible proporcionar un puerto personalizado con esa bandera, por ejemplo, --inspect=9222
aceptará conexiones de DevTools en el puerto 9222.
El uso de la bandera --inspect
ejecutará el código inmediatamente antes de que se conecte el depurador. Esto significa que el código comenzará a ejecutarse antes de que pueda comenzar a depurar, lo que podría no ser ideal si desea depurar desde el principio.
En tales casos, tiene dos alternativas:
Entonces, al decidir entre --inspect
, --inspect-wait
y --inspect-brk
, considere si desea que el código comience a ejecutarse inmediatamente, esperar a que se adjunte el depurador antes de la ejecución o detenerse en la primera línea para la depuración paso a paso.
$ node --inspect index.js
Debugger listening on ws://127.0.0.1:9229/dc9010dd-f8b8-4ac5-a510-c1a114ec7d29
Para obtener ayuda, consulte: https://nodejs.org/en/docs/inspector
(En el ejemplo anterior, el UUID dc9010dd-f8b8-4ac5-a510-c1a114ec7d29 al final de la URL se genera sobre la marcha, varía en diferentes sesiones de depuración).
Si el navegador Chrome es anterior a la versión 66.0.3345.0, utilice inspector.html
en lugar de js_app.html
en la URL anterior.
Chrome DevTools aún no admite la depuración de hilos de trabajo. Se puede usar ndb para depurarlos.