Инспектор
Исходный код: lib/inspector.js
Модуль inspector предоставляет API для взаимодействия с инспектором V8.
К нему можно получить доступ, используя:
const inspector = require('inspector'); inspector.close()
Деактивирует инспектор. Блокирует выполнение, пока не будут закрыты все активные подключения.
inspector.console
- <Объект> Объект для отправки сообщений в удалённую консоль инспектора.
require('inspector').console.log('a message'); Консоль инспектора не имеет полной совместимости с консолью Node.js.
inspector.open([port[, host[, wait]]])
-
port<число> Порт для прослушивания подключений инспектора. Необязательно. По умолчанию: значение, указанное в командной строке. -
host<строка> Хост для прослушивания подключений инспектора. Необязательно. По умолчанию: значение, указанное в командной строке. -
wait<логическое значение> Блокировать выполнение, пока клиент не подключится. Необязательно. По умолчанию:false.
Активирует инспектор на указанном хосте и порту. Эквивалентно node --inspect=[[host:]port], но может быть выполнено программно после запуска Node.js.
Если wait равно true, выполнение будет заблокировано до тех пор, пока клиент не подключится к порту инспекции и управление не будет передано клиенту отладчика.
См. предупреждение о безопасности в отношении использования параметра host.
inspector.url()
- Возвращает: <строка> | <неопределённое>
Возвращает 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
inspector.waitForDebugger()
Блокирует выполнение, пока клиент (существующий или подключившийся позднее) не отправит команду Runtime.runIfWaitingForDebugger.
Исключение будет выброшено, если активного инспектора нет.
Класс: inspector.Session
- Расширяет: <EventEmitter>
Класс inspector.Session используется для отправки сообщений в бэкенд V8 инспектора и получения ответов и уведомлений.
new inspector.Session()
Создаёт новый экземпляр класса inspector.Session. Сессия инспектора должна быть подключена через session.connect() перед отправкой сообщений в бэкенд инспектора.
Событие: 'inspectorNotification'
- <Объект> Объект сообщения уведомления
Вызывается при получении любого уведомления от V8 инспектора.
session.on('inspectorNotification', (message) => console.log(message.method));
// Debugger.paused
// Debugger.resumed Также возможно подписываться только на уведомления с определённым методом:
Событие: <inspector-protocol-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()
Подключает сессию к бэкенду инспектора.
session.connectToMainThread()
Подключает сессию к инспектору главного потока. Исключение будет выброшено, если этот API не был вызван в потоке-рабочем.
session.disconnect()
Немедленно закрывает сессию. Все ожидающие обработчики сообщений будут вызваны с ошибкой. Для возможности отправки сообщений снова необходимо вызвать session.connect(). Переподключенная сессия потеряет все состояние инспектора, такие как включенные агенты или настроенные точки останова.
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, используемых для проверки состояния приложения и прослушивания событий runtime.
Примеры использования
Помимо отладчика, доступны различные профилировщики V8 через протокол DevTools.
Профилировщик CPU
Вот пример использования профилировщика CPU:
const inspector = require('inspector');
const fs = require('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));
}
});
});
}); Профилировщик кучи
Вот пример использования профилировщика кучи:
const inspector = require('inspector');
const fs = require('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);
});
© 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-v14.x/docs/api/inspector.html