Spec-Zone.ru › Node.js 24 LTS

Инспектор

Стабильность: 2 — Стабильный

Исходный код: lib/inspector.js

Модуль node:inspector предоставляет API для взаимодействия с инспектором V8.

К нему можно получить доступ с помощью:

Модули JavaScript
import * as inspector from 'node:inspector/promises';
CommonJS
const inspector = require('node:inspector/promises');

или

Модули JavaScript
import * as inspector from 'node:inspector';
CommonJS
const inspector = require('node:inspector');

API промисов

Добавлено в: v19.0.0
Стабильность: 1 — Экспериментальный

Класс: inspector.Session

  • Расширяет: <EventEmitter>

Класс inspector.Session используется для отправки сообщений серверной части инспектора V8 и получения ответов на сообщения и уведомлений.

new inspector.Session()
Добавлено в: v8.0.0

Создает новый экземпляр класса inspector.Session. Перед отправкой сообщений серверной части инспектора необходимо подключить сеанс инспектора с помощью session.connect().

При использовании Session объект, выводимый API консоли, не будет освобожден, пока мы вручную не выполним команду Runtime.DiscardConsoleEntries.

Событие: 'inspectorNotification'
Добавлено в: v8.0.0
  • Тип: <Object> Объект сообщения-уведомления

Возникает при получении любого уведомления от инспектора V8.

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

Предупреждение Не рекомендуется устанавливать точки останова в сеансе, работающем в том же потоке; см. поддержку точек останова.

Также можно подписаться только на уведомления с определенным методом:

Событие: <inspector-protocol-method>
Добавлено в: v8.0.0
  • Тип: <Object> Объект сообщения-уведомления

Возникает при получении уведомления инспектора, поле method которого имеет значение <inspector-protocol-method>.

Следующий фрагмент кода устанавливает обработчик события 'Debugger.paused' и выводит причину приостановки программы каждый раз, когда выполнение программы приостанавливается (например, при срабатывании точек останова):

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

Предупреждение Не рекомендуется устанавливать точки останова в сеансе, работающем в том же потоке; см. поддержку точек останова.

session.connect()
Добавлено в: v8.0.0

Подключает сеанс к серверной части инспектора.

session.connectToMainThread()
Добавлено в: v12.11.0

Подключает сеанс к серверной части инспектора главного потока. Если этот API вызван не в потоке Worker, будет выброшено исключение.

session.disconnect()
Добавлено в: v8.0.0

Немедленно закрывает сеанс. Для всех ожидающих вызовов обратного вызова сообщений будет вызвана функция с ошибкой. Чтобы снова отправлять сообщения, необходимо вызвать session.connect(). При повторном подключении сеанс потеряет все состояние инспектора, например активированные агенты или настроенные точки останова.

session.post(method[, params])
Добавлено в: v19.0.0
  • method <string>
  • params <Object>
  • Возвращает: <Promise>

Отправляет сообщение серверной части инспектора.

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' } } copy

Последняя версия протокола инспектора V8 опубликована в средстве просмотра протокола Chrome DevTools.

Инспектор Node.js поддерживает все домены протокола Chrome DevTools, объявленные в V8. Домены протокола Chrome DevTools предоставляют интерфейс для взаимодействия с одним из агентов среды выполнения, используемых для проверки состояния приложения и прослушивания событий во время выполнения.

Пример использования

Помимо отладчика, через протокол DevTools доступны различные профилировщики V8.

Профилировщик ЦП

Пример использования профилировщика ЦП:

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');
// Invoke business logic under measurement here...

// some time later...
const { profile } = await session.post('Profiler.stop');

// Write profile to disk, upload, etc.
fs.writeFileSync('./profile.cpuprofile', JSON.stringify(profile)); copy
Профилировщик кучи

Пример использования профилировщика кучи:

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); copy

API обратного вызова

Класс: inspector.Session

  • Расширяет: <EventEmitter>

Класс inspector.Session используется для отправки сообщений серверной части инспектора V8 и получения ответов на сообщения и уведомлений.

new inspector.Session()
Добавлено в: v8.0.0

Создает новый экземпляр класса inspector.Session. Перед отправкой сообщений серверной части инспектора необходимо подключить сеанс инспектора с помощью session.connect().

При использовании Session объект, выводимый API консоли, не будет освобожден, пока мы вручную не выполним команду Runtime.DiscardConsoleEntries.

Событие: 'inspectorNotification'
Добавлено в: v8.0.0
  • Тип: <Object> Объект сообщения-уведомления

Возникает при получении любого уведомления от инспектора V8.

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

Предупреждение Не рекомендуется устанавливать точки останова в сеансе, работающем в том же потоке; см. поддержку точек останова.

Также можно подписаться только на уведомления с определенным методом:

Событие: <inspector-protocol-method>;
Добавлено в: v8.0.0
  • Тип: <Object> Объект сообщения-уведомления

Возникает при получении уведомления инспектора, поле method которого имеет значение <inspector-protocol-method>.

Следующий фрагмент кода устанавливает обработчик события 'Debugger.paused' и выводит причину приостановки программы каждый раз, когда выполнение программы приостанавливается (например, при срабатывании точек останова):

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

Предупреждение Не рекомендуется устанавливать точки останова в сеансе, работающем в том же потоке; см. поддержку точек останова.

session.connect()
Добавлено в: v8.0.0

Подключает сеанс к серверной части инспектора.

session.connectToMainThread()
Добавлено в: v12.11.0

Подключает сеанс к серверной части инспектора главного потока. Если этот API вызван не в потоке Worker, будет выброшено исключение.

session.disconnect()
Добавлено в: v8.0.0

Немедленно закрывает сеанс. Для всех ожидающих вызовов обратного вызова сообщений будет вызвана функция с ошибкой. Чтобы снова отправлять сообщения, необходимо вызвать session.connect(). При повторном подключении сеанс потеряет все состояние инспектора, например активированные агенты или настроенные точки останова.

session.post(method[, params][, callback])
История
Версия Изменения
v18.0.0

Передача недопустимого обратного вызова в аргумент callback теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK.

v8.0.0

Добавлено в: v8.0.0

  • method <string>
  • params <Object>
  • callback <Function>

Отправляет сообщение серверной части инспектора. После получения ответа будет вызван callback. callback — это функция, принимающая два необязательных аргумента: ошибку и результат, специфичный для сообщения.

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

Последняя версия протокола инспектора V8 опубликована в средстве просмотра протокола Chrome DevTools.

Инспектор Node.js поддерживает все домены протокола Chrome DevTools, объявленные в V8. Домены протокола Chrome DevTools предоставляют интерфейс для взаимодействия с одним из агентов среды выполнения, используемых для проверки состояния приложения и прослушивания событий во время выполнения.

При отправке команды HeapProfiler.takeHeapSnapshot или HeapProfiler.stopTrackingHeapObjects в V8 нельзя задавать reportProgress равным true.

Пример использования

Помимо отладчика, через протокол DevTools доступны различные профилировщики V8.

Профилировщик ЦП

Пример использования профилировщика ЦП:

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', () => {
    // Invoke business logic under measurement here...

    // some time later...
    session.post('Profiler.stop', (err, { profile }) => {
      // Write profile to disk, upload, etc.
      if (!err) {
        fs.writeFileSync('./profile.cpuprofile', JSON.stringify(profile));
      }
    });
  });
}); copy
Профилировщик кучи

Пример использования профилировщика кучи:

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 done:', err, r);
  session.disconnect();
  fs.closeSync(fd);
}); copy

Общие объекты

inspector.close()

История
Версия Изменения
v18.10.0

API доступен в потоках Worker.

v9.0.0

Добавлено в: v9.0.0

Пытается закрыть все оставшиеся соединения, блокируя цикл событий до их закрытия. После закрытия всех соединений деактивирует инспектор.

inspector.console

  • Тип: <Object> Объект для отправки сообщений удаленной консоли инспектора.
require('node:inspector').console.log('a message'); copy

API консоли инспектора не полностью соответствует API консоли Node.js.

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

История
Версия Изменения
v20.6.0

Теперь inspector.open() возвращает объект Disposable.

  • port <number> Порт для прослушивания соединений инспектора. Необязательный параметр. По умолчанию: значение, указанное в командной строке.
  • host <string> Хост для прослушивания соединений инспектора. Необязательный параметр. По умолчанию: значение, указанное в командной строке.
  • wait <boolean> Блокировать выполнение до подключения клиента. Необязательный параметр. По умолчанию: false.
  • Возвращает: <Disposable> Объект Disposable, вызывающий inspector.close().

Активирует инспектор на указанном хосте и порте. Эквивалентно node --inspect=[[host:]port], но может быть выполнено программно после запуска Node.js.

Если wait имеет значение true, выполнение будет заблокировано до подключения клиента к порту инспектора и передачи управления отладчику.

См. предупреждение о безопасности относительно использования параметра host.

inspector.url()

  • Возвращает: <string> | <undefined>

Возвращает URL активного инспектора или undefined, если он отсутствует.

$ 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 copy

inspector.waitForDebugger()

Добавлено в: v12.7.0

Блокирует выполнение, пока клиент (уже подключенный или подключившийся позднее) не отправит команду Runtime.runIfWaitingForDebugger.

Если активный инспектор отсутствует, будет выброшено исключение.

Интеграция с DevTools

Стабильность: 1.1 — Активная разработка

Модуль node:inspector предоставляет API для интеграции с инструментами разработчика, поддерживающими протокол Chrome DevTools. Подключенные к работающему экземпляру Node.js интерфейсы DevTools могут перехватывать события протокола, отправляемые экземпляром, и отображать их соответствующим образом, упрощая отладку. Следующие методы рассылают событие протокола всем подключенным интерфейсам. Аргумент params, передаваемый методам, может быть необязательным в зависимости от протокола.

// The `Network.requestWillBeSent` event will be fired.
inspector.Network.requestWillBeSent({
  requestId: 'request-id-1',
  timestamp: Date.now() / 1000,
  wallTime: Date.now(),
  request: {
    url: 'https://nodejs.org/en',
    method: 'GET',
  },
}); copy

inspector.Network.dataReceived([params])

Добавлено в: v24.2.0
  • params <Object>

Эта функция доступна только при включенном флаге --experimental-network-inspection.

Рассылает событие Network.dataReceived подключенным интерфейсам или буферизует данные, если для данного запроса еще не была вызвана команда Network.streamResourceContent.

Также позволяет команде Network.getResponseBody получать данные ответа.

inspector.Network.dataSent([params])

Добавлено в: v24.3.0
  • params <Object>

Эта функция доступна только при включенном флаге --experimental-network-inspection.

Позволяет команде Network.getRequestPostData получать данные запроса.

inspector.Network.requestWillBeSent([params])

Добавлено в: v22.6.0, v20.18.0
  • params <Object>

Эта функция доступна только при включенном флаге --experimental-network-inspection.

Рассылает событие Network.requestWillBeSent подключенным интерфейсам. Это событие указывает, что приложение собирается отправить HTTP-запрос.

inspector.Network.responseReceived([params])

Добавлено в: v22.6.0, v20.18.0
  • params <Object>

Эта функция доступна только при включенном флаге --experimental-network-inspection.

Рассылает событие Network.responseReceived подключенным интерфейсам. Это событие указывает, что HTTP-ответ доступен.

inspector.Network.loadingFinished([params])

Добавлено в: v22.6.0, v20.18.0
  • params <Object>

Эта функция доступна только при включенном флаге --experimental-network-inspection.

Рассылает событие Network.loadingFinished подключенным интерфейсам. Это событие указывает, что загрузка HTTP-запроса завершена.

inspector.Network.loadingFailed([params])

Добавлено в: v22.7.0, v20.18.0
  • params <Object>

Эта функция доступна только при включенном флаге --experimental-network-inspection.

Рассылает событие Network.loadingFailed подключенным интерфейсам. Это событие указывает, что загрузка HTTP-запроса завершилась ошибкой.

inspector.Network.webSocketCreated([params])

Добавлено в: v24.7.0
  • params <Object>

Эта функция доступна только при включенном флаге --experimental-network-inspection.

Рассылает событие Network.webSocketCreated подключенным интерфейсам. Это событие указывает, что было инициировано соединение WebSocket.

inspector.Network.webSocketHandshakeResponseReceived([params])

Добавлено в: v24.7.0
  • params <Object>

Эта функция доступна только при включенном флаге --experimental-network-inspection.

Рассылает событие Network.webSocketHandshakeResponseReceived подключенным интерфейсам. Это событие указывает, что получен ответ на рукопожатие WebSocket.

inspector.Network.webSocketClosed([params])

Добавлено в: v24.7.0
  • params <Object>

Эта функция доступна только при включенном флаге --experimental-network-inspection.

Рассылает событие Network.webSocketClosed подключенным интерфейсам. Это событие указывает, что соединение WebSocket было закрыто.

inspector.NetworkResources.put

Добавлено в: v24.5.0
Стабильность: 1.1 — Активная разработка

Эта функция доступна только при включенном флаге --experimental-inspector-network-resource.

Метод inspector.NetworkResources.put используется для предоставления ответа на запрос loadNetworkResource, отправленный через протокол Chrome DevTools (CDP). Обычно это происходит, когда карта исходного кода указана URL-адресом и интерфейс DevTools, например Chrome, запрашивает ресурс для получения карты исходного кода.

Этот метод позволяет разработчикам заранее определить содержимое ресурса, которое будет предоставлено в ответ на такие запросы CDP.

const inspector = require('node:inspector');
// By preemptively calling put to register the resource, a source map can be resolved when
// a loadNetworkResource request is made from the frontend.
async function setNetworkResources() {
  const mapUrl = 'http://localhost:3000/dist/app.js.map';
  const tsUrl = 'http://localhost:3000/src/app.ts';
  const distAppJsMap = await fetch(mapUrl).then((res) => res.text());
  const srcAppTs = await fetch(tsUrl).then((res) => res.text());
  inspector.NetworkResources.put(mapUrl, distAppJsMap);
  inspector.NetworkResources.put(tsUrl, srcAppTs);
};
setNetworkResources().then(() => {
  require('./dist/app');
}); copy

Дополнительные сведения см. в официальной документации CDP: Network.loadNetworkResource

Поддержка точек останова

Домен Debugger протокола Chrome DevTools позволяет inspector.Session подключаться к программе и устанавливать точки останова для пошагового выполнения кода.

Однако следует избегать установки точек останова с помощью inspector.Session в том же потоке, подключенного посредством session.connect(), поскольку присоединяемая и приостанавливаемая программа — это сам отладчик. Вместо этого попробуйте подключиться к главному потоку с помощью session.connectToMainThread() и установить точки останова в потоке Worker либо подключиться по WebSocket к программе отладчика.

© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v24.x/docs/api/inspector.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API