Инспектор
Модуль inspector предоставляет API для взаимодействия с инспектором V8.
К нему можно получить доступ, используя:
const inspector = require('inspector');
inspector.open([port[, host[, wait]]])
-
port<число> Порт для прослушивания соединений инспектора. Необязательно. По умолчанию: то, что было указано в командной строке. -
host<строка> Хост для прослушивания соединений инспектора. Необязательно. По умолчанию: то, что было указано в командной строке. -
wait<логическое значение> Блокировать выполнение, пока не подключится клиент. Необязательно. По умолчанию:false.
Активировать инспектор на указанном хосте и порту. Эквивалентно node
--inspect=[[host:]port], но может выполняться программно после запуска node.
Если wait — true, выполнение будет заблокировано, пока клиент не подключится к порту инспекции и управление не будет передано клиенту отладчика.
inspector.close()
Деактивировать инспектор. Блокирует выполнение, пока не завершатся все активные соединения.
inspector.url()
Возвращает URL активного инспектора или undefined, если инспектор отсутствует.
Класс: inspector.Session
Класс inspector.Session используется для отправки сообщений в бэкэнд инспектора V8 и получения ответов на сообщения и уведомлений.
Конструктор: new inspector.Session()
Создать новый экземпляр класса inspector.Session. Сеансу инспектора необходимо подключиться через session.connect() перед отправкой сообщений в бэкэнд инспектора.
inspector.Session — это EventEmitter с следующими событиями:
Событие: 'inspectorNotification'
- <Объект> Объект сообщения уведомления
Вызывается при получении любого уведомления от инспектора V8.
session.on('inspectorNotification', (message) => console.log(message.method));
// Debugger.paused
// Debugger.resumed
Также возможно подписаться только на уведомления с определённым методом:
Событие: <inspector-protocol-method>
- <Объект> Объект сообщения уведомления
Вызывается при получении уведомления инспектора, у которого поле method установлено в значение <inspector-protocol-method>.
Следующий фрагмент устанавливает обработчик события Debugger.paused и выводит причину приостановки выполнения программы при каждом её приостановлении (например, при достижении точки останова):
session.on('Debugger.paused', ({ params }) => {
console.log(params.hitBreakpoints);
});
// [ '/the/file/that/has/the/breakpoint.js:11:0' ]
session.connect()
Подключает сеанс к бэкэнду инспектора. Вызов исключения произойдёт, если уже существует подключенный сеанс, установленный либо через API, либо через фронтенд, подключённый к порту WebSocket инспектора.
session.post(method[, params][, callback])
Отправляет сообщение в бэкэнд инспектора. Обработчик callback будет вызван при получении ответа. callback — функция, принимающая два необязательных аргумента — ошибку и результат, специфичный для сообщения.
session.post('Runtime.evaluate', { expression: '2 + 2' },
(error, { result }) => console.log(result));
// Output: { type: 'number', value: 4, description: '4' }
Самая последняя версия протокола V8 инспектора опубликована на сайте Chrome DevTools Protocol Viewer.
Инспектор Node.js поддерживает все домены протокола Chrome DevTools, объявленные V8. Домен протокола Chrome DevTools предоставляет интерфейс для взаимодействия с одним из агентов runtime, используемым для проверки состояния приложения и прослушивания событий во время выполнения.
session.disconnect()
Немедленно закрывает сеанс. Все ожидающие обратные вызовы сообщений будут вызваны с ошибкой. Для отправки сообщений снова потребуется вызвать session.connect(). При повторном подключении сеанс потеряет всё состояние инспектора, такие как включенные агенты или настроенные точки останова.
Пример использования
Профилировщик CPU
Помимо отладчика, через протокол DevTools доступны различные профилировщики V8. Вот простой пример использования профилировщика CPU:
const inspector = require('inspector');
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', ({ profile }) => {
// write profile to disk, upload, etc.
});
});
});
© 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-v8.x/docs/api/inspector.html