Skip to content

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.

bash
$ 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.

bash
$ 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ón
  • next, n: Paso siguiente
  • step, s: Paso dentro
  • out, o: Paso fuera
  • pause: 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 actual
  • setBreakpoint(line), sb(line): Establecer punto de interrupción en una línea específica
  • setBreakpoint('fn()'), sb(...): Establecer punto de interrupción en la primera instrucción del cuerpo de la función
  • setBreakpoint('script.js', 1), sb(...): Establecer punto de interrupción en la primera línea de script.js
  • setBreakpoint('script.js', 1, 'num < 4'), sb(...): Establecer punto de interrupción condicional en la primera línea de script.js que solo se interrumpe cuando num < 4 se evalúa como true
  • clearBreakpoint('script.js', 1), cb(...): Borrar punto de interrupción en script.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:

bash
$ 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:

bash
$ 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 actual
  • list(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 seguimiento
  • unwatch(expr): Eliminar una expresión de la lista de seguimiento
  • unwatch(index): Eliminar una expresión de la lista de seguimiento en un índice específico
  • watchers: 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ón
  • exec expr, p expr: Ejecutar una expresión en el contexto del script de depuración e imprimir su valor
  • profile: Iniciar una sesión de perfilado de CPU
  • profileEnd: Detener la sesión de perfilado de CPU actual
  • profiles: Listar todas las sesiones de perfilado de CPU completadas
  • profiles[n].save(filepath = 'node.cpuprofile'): Guardar la sesión de perfilado de CPU en el disco como JSON
  • takeHeapSnapshot(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 script
  • kill: Matar script

Varios

  • scripts: Lista todos los scripts cargados
  • version: 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.

bash
$ 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.