Skip to content

Inspector

[Estable: 2 - Estable]

Estable: 2 Estabilidad: 2 - Estable

Código fuente: lib/inspector.js

El módulo node:inspector proporciona una API para interactuar con el inspector de V8.

Se puede acceder usando:

js
import * as inspector from 'node:inspector/promises'
js
const inspector = require('node:inspector/promises')

o

js
import * as inspector from 'node:inspector'
js
const inspector = require('node:inspector')

API de Promesas

[Estable: 1 - Experimental]

Estable: 1 Estabilidad: 1 - Experimental

Añadido en: v19.0.0

Clase: inspector.Session

inspector.Session se utiliza para enviar mensajes al backend del inspector de V8 y recibir respuestas y notificaciones de mensajes.

new inspector.Session()

Agregado en: v8.0.0

Crea una nueva instancia de la clase inspector.Session. La sesión del inspector necesita ser conectada a través de session.connect() antes de que los mensajes puedan ser despachados al backend del inspector.

Cuando se usa Session, el objeto emitido por la API de la consola no será liberado, a menos que ejecutemos manualmente el comando Runtime.DiscardConsoleEntries.

Evento: 'inspectorNotification'

Agregado en: v8.0.0

  • <Objeto> El objeto del mensaje de notificación

Emitido cuando se recibe cualquier notificación del V8 Inspector.

js
session.on('inspectorNotification', message => console.log(message.method))
// Debugger.paused
// Debugger.resumed

También es posible suscribirse solo a las notificaciones con un método específico:

Evento: &lt;inspector-protocol-method&gt;; {#event-<inspector-protocol-method>;}

Agregado en: v8.0.0

  • <Objeto> El objeto del mensaje de notificación

Emitido cuando se recibe una notificación del inspector que tiene su campo de método establecido al valor \<inspector-protocol-method\>.

El siguiente fragmento instala un listener en el evento 'Debugger.paused', e imprime la razón de la suspensión del programa cada vez que la ejecución del programa se suspende (a través de puntos de interrupción, por ejemplo):

js
session.on('Debugger.paused', ({ params }) => {
  console.log(params.hitBreakpoints)
})
// [ '/the/file/that/has/the/breakpoint.js:11:0' ]

session.connect()

Agregado en: v8.0.0

Conecta una sesión al back-end del inspector.

session.connectToMainThread()

Agregado en: v12.11.0

Conecta una sesión al back-end del inspector del hilo principal. Se lanzará una excepción si esta API no se llamó en un hilo de Worker.

session.disconnect()

Agregado en: v8.0.0

Cierra inmediatamente la sesión. Todas las devoluciones de llamada de mensajes pendientes se llamarán con un error. Se deberá llamar a session.connect() para poder enviar mensajes nuevamente. La sesión reconectada perderá todo el estado del inspector, como los agentes habilitados o los puntos de interrupción configurados.

session.post(method[, params])

Agregado en: v19.0.0

Publica un mensaje en el back-end del inspector.

js
import { Session } from 'node:inspector/promises'
try {
  const session = new Session()
  session.connect()
  const result = await session.post('Runtime.evaluate', { expression: '2 + 2' })
  console.log(result)
} catch (error) {
  console.error(error)
}
// Output: { result: { type: 'number', value: 4, description: '4' } }

La última versión del protocolo del inspector V8 se publica en el Visor del protocolo de Chrome DevTools.

El inspector de Node.js admite todos los dominios del protocolo de Chrome DevTools declarados por V8. El dominio del protocolo de Chrome DevTools proporciona una interfaz para interactuar con uno de los agentes de tiempo de ejecución utilizados para inspeccionar el estado de la aplicación y escuchar los eventos de tiempo de ejecución.

Ejemplo de uso

Además del depurador, hay varios perfiles de V8 disponibles a través del protocolo DevTools.

Perfilador de CPU

Aquí hay un ejemplo que muestra cómo usar el Perfilador de CPU:

js
import { Session } from 'node:inspector/promises'
import fs from 'node:fs'
const session = new Session()
session.connect()

await session.post('Profiler.enable')
await session.post('Profiler.start')
// Invoca la lógica de negocio bajo medición aquí...

// Algún tiempo después...
const { profile } = await session.post('Profiler.stop')

// Escribe el perfil en el disco, súbelo, etc.
fs.writeFileSync('./profile.cpuprofile', JSON.stringify(profile))
Perfilador de montón

Aquí hay un ejemplo que muestra cómo usar el Perfilador de montón:

js
import { Session } from 'node:inspector/promises'
import fs from 'node:fs'
const session = new Session()

const fd = fs.openSync('profile.heapsnapshot', 'w')

session.connect()

session.on('HeapProfiler.addHeapSnapshotChunk', m => {
  fs.writeSync(fd, m.params.chunk)
})

const result = await session.post('HeapProfiler.takeHeapSnapshot', null)
console.log('HeapProfiler.takeHeapSnapshot done:', result)
session.disconnect()
fs.closeSync(fd)

API de Callback

Clase: inspector.Session

La inspector.Session se utiliza para enviar mensajes al back-end del inspector V8 y recibir respuestas de mensajes y notificaciones.

new inspector.Session()

Añadido en: v8.0.0

Crea una nueva instancia de la clase inspector.Session. La sesión del inspector necesita conectarse a través de session.connect() antes de que los mensajes puedan ser enviados al back-end del inspector.

Cuando se usa Session, el objeto generado por la API de la consola no se liberará, a menos que se realice manualmente el comando Runtime.DiscardConsoleEntries.

Evento: 'inspectorNotification'

Añadido en: v8.0.0

  • <Objeto> El objeto del mensaje de notificación

Se emite cuando se recibe cualquier notificación del Inspector V8.

js
session.on('inspectorNotification', message => console.log(message.method))
// Debugger.paused
// Debugger.resumed

También es posible suscribirse solo a notificaciones con un método específico:

Evento: &lt;inspector-protocol-method&gt;; {#event-<inspector-protocol-method>;_1}

Agregado en: v8.0.0

  • <Object> El objeto de mensaje de notificación

Se emite cuando se recibe una notificación del inspector que tiene su campo de método establecido en el valor \<inspector-protocol-method\>.

El siguiente fragmento instala un escucha en el evento 'Debugger.paused' e imprime la razón de la suspensión del programa cada vez que se suspende la ejecución del programa (por ejemplo, a través de puntos de interrupción):

js
session.on('Debugger.paused', ({ params }) => {
  console.log(params.hitBreakpoints)
})
// [ '/el/archivo/que/tiene/el/punto/de/interrupción.js:11:0' ]

session.connect()

Agregado en: v8.0.0

Conecta una sesión al backend del inspector.

session.connectToMainThread()

Agregado en: v12.11.0

Conecta una sesión al backend del inspector del hilo principal. Se lanzará una excepción si esta API no se llamó en un hilo Worker.

session.disconnect()

Agregado en: v8.0.0

Cierra inmediatamente la sesión. Todas las devoluciones de llamada de mensajes pendientes se invocarán con un error. Se deberá llamar a session.connect() para poder enviar mensajes nuevamente. La sesión reconectada perderá todo el estado del inspector, como los agentes habilitados o los puntos de interrupción configurados.

session.post(method[, params][, callback])

[Historial]

VersiónCambios
v18.0.0Pasar una devolución de llamada inválida al argumento callback ahora lanza ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK.
v8.0.0Agregado en: v8.0.0

Publica un mensaje al backend del inspector. Se notificará a callback cuando se reciba una respuesta. callback es una función que acepta dos argumentos opcionales: error y resultado específico del mensaje.

js
session.post('Runtime.evaluate', { expression: '2 + 2' }, (error, { result }) => console.log(result))
// Output: { type: 'number', value: 4, description: '4' }

La última versión del protocolo del inspector V8 se publica en el Visor del Protocolo de Chrome DevTools.

El inspector de Node.js admite todos los dominios del Protocolo de Chrome DevTools declarados por V8. El dominio del Protocolo de Chrome DevTools proporciona una interfaz para interactuar con uno de los agentes de tiempo de ejecución utilizados para inspeccionar el estado de la aplicación y escuchar los eventos de tiempo de ejecución.

No puedes establecer reportProgress en true al enviar un comando HeapProfiler.takeHeapSnapshot o HeapProfiler.stopTrackingHeapObjects a V8.

Ejemplo de uso

Además del depurador, varios Perfiles de V8 están disponibles a través del protocolo DevTools.

Perfilador de CPU

Aquí hay un ejemplo que muestra cómo usar el Perfilador de CPU:

js
const inspector = require('node:inspector')
const fs = require('node:fs')
const session = new inspector.Session()
session.connect()

session.post('Profiler.enable', () => {
  session.post('Profiler.start', () => {
    // Invoca la lógica de negocio bajo medición aquí...

    // algún tiempo después...
    session.post('Profiler.stop', (err, { profile }) => {
      // Escribe el perfil en el disco, carga, etc.
      if (!err) {
        fs.writeFileSync('./profile.cpuprofile', JSON.stringify(profile))
      }
    })
  })
})
Perfilador de Heap

Aquí hay un ejemplo que muestra cómo usar el Perfilador de Heap:

js
const inspector = require('node:inspector')
const fs = require('node:fs')
const session = new inspector.Session()

const fd = fs.openSync('profile.heapsnapshot', 'w')

session.connect()

session.on('HeapProfiler.addHeapSnapshotChunk', m => {
  fs.writeSync(fd, m.params.chunk)
})

session.post('HeapProfiler.takeHeapSnapshot', null, (err, r) => {
  console.log('HeapProfiler.takeHeapSnapshot hecho:', err, r)
  session.disconnect()
  fs.closeSync(fd)
})

Objetos Comunes

inspector.close()

[Historial]

VersiónCambios
v18.10.0La API se expone en los hilos de trabajo.
v9.0.0Añadido en: v9.0.0

Intenta cerrar todas las conexiones restantes, bloqueando el bucle de eventos hasta que todas estén cerradas. Una vez que todas las conexiones están cerradas, desactiva el inspector.

inspector.console

  • <Object> Un objeto para enviar mensajes a la consola del inspector remoto.
js
require('node:inspector').console.log('un mensaje')

La consola del inspector no tiene paridad de API con la consola de Node.js.

inspector.open([port[, host[, wait]]])

[Historial]

VersiónCambios
v20.6.0inspector.open() ahora devuelve un objeto Disposable.
  • port <number> Puerto para escuchar las conexiones del inspector. Opcional. Predeterminado: lo que se especificó en la CLI.
  • host <string> Host para escuchar las conexiones del inspector. Opcional. Predeterminado: lo que se especificó en la CLI.
  • wait <boolean> Bloquear hasta que un cliente se haya conectado. Opcional. Predeterminado: false.
  • Devuelve: <Disposable> Un Disposable que llama a inspector.close().

Activa el inspector en el host y el puerto. Equivalente a node --inspect=[[host:]port], pero se puede hacer programáticamente después de que se haya iniciado node.

Si wait es true, se bloqueará hasta que un cliente se haya conectado al puerto de inspección y el control de flujo se haya pasado al cliente del depurador.

Consulte la advertencia de seguridad con respecto al uso del parámetro host.

inspector.url()

Devuelve la URL del inspector activo o undefined si no hay ninguno.

bash
$ node --inspect -p 'inspector.url()'
Debugger listening on ws://127.0.0.1:9229/166e272e-7a30-4d09-97ce-f1c012b43c34
For help, see: https://nodejs.org/en/docs/inspector
ws://127.0.0.1:9229/166e272e-7a30-4d09-97ce-f1c012b43c34

$ node --inspect=localhost:3000 -p 'inspector.url()'
Debugger listening on ws://localhost:3000/51cf8d0e-3c36-4c59-8efd-54519839e56a
For help, see: https://nodejs.org/en/docs/inspector
ws://localhost:3000/51cf8d0e-3c36-4c59-8efd-54519839e56a

$ node -p 'inspector.url()'
undefined

inspector.waitForDebugger()

Agregado en: v12.7.0

Se bloquea hasta que un cliente (existente o conectado más tarde) ha enviado el comando Runtime.runIfWaitingForDebugger.

Se lanzará una excepción si no hay un inspector activo.

Integración con DevTools

El módulo node:inspector proporciona una API para la integración con herramientas de desarrollo que admiten el Protocolo de DevTools de Chrome. Las interfaces de DevTools conectadas a una instancia de Node.js en ejecución pueden capturar eventos de protocolo emitidos desde la instancia y mostrarlos en consecuencia para facilitar la depuración. Los siguientes métodos transmiten un evento de protocolo a todas las interfaces conectadas. Los params pasados a los métodos pueden ser opcionales, dependiendo del protocolo.

js
// Se activará el evento `Network.requestWillBeSent`.
inspector.Network.requestWillBeSent({
  requestId: 'request-id-1',
  timestamp: Date.now() / 1000,
  wallTime: Date.now(),
  request: {
    url: 'https://nodejs.org/en',
    method: 'GET',
  },
})

inspector.Network.requestWillBeSent([params])

Agregado en: v22.6.0, v20.18.0

[Estable: 1 - Experimental]

Estable: 1 Estabilidad: 1 - Experimental

Esta función solo está disponible con el indicador --experimental-network-inspection habilitado.

Transmite el evento Network.requestWillBeSent a las interfaces conectadas. Este evento indica que la aplicación está a punto de enviar una solicitud HTTP.

inspector.Network.responseReceived([params])

Agregado en: v22.6.0, v20.18.0

[Estable: 1 - Experimental]

Estable: 1 Estabilidad: 1 - Experimental

Esta función solo está disponible con la bandera --experimental-network-inspection habilitada.

Emite el evento Network.responseReceived a las interfaces conectadas. Este evento indica que la respuesta HTTP está disponible.

inspector.Network.loadingFinished([params])

Agregado en: v22.6.0, v20.18.0

[Estable: 1 - Experimental]

Estable: 1 Estabilidad: 1 - Experimental

Esta función solo está disponible con la bandera --experimental-network-inspection habilitada.

Emite el evento Network.loadingFinished a las interfaces conectadas. Este evento indica que la carga de la solicitud HTTP ha finalizado.

inspector.Network.loadingFailed([params])

Agregado en: v22.7.0, v20.18.0

[Estable: 1 - Experimental]

Estable: 1 Estabilidad: 1 - Experimental

Esta función solo está disponible con el indicador --experimental-network-inspection habilitado.

Transmite el evento Network.loadingFailed a los frontends conectados. Este evento indica que una solicitud HTTP no se ha podido cargar.

Soporte de puntos de interrupción

El dominio Debugger del Protocolo de Chrome DevTools permite que una inspector.Session se adjunte a un programa y establezca puntos de interrupción para recorrer el código paso a paso.

Sin embargo, se debe evitar establecer puntos de interrupción con una inspector.Session del mismo hilo, que está conectada mediante session.connect(), ya que el programa al que se adjunta y se pausa es exactamente el propio depurador. En su lugar, intente conectarse al hilo principal mediante session.connectToMainThread() y establecer puntos de interrupción en un hilo de trabajador, o conectarse con un programa Depurador a través de una conexión WebSocket.