Инспектор
Исходный код: 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.
Если 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>;
- <Объект> Объект сообщения уведомления
Вызывается при получении уведомления инспектора, у которого поле 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 был вызван в потоке Worker.
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.
Инспектор Node.js поддерживает все домены протокола Chrome DevTools, объявленные V8. Домен протокола Chrome DevTools предоставляет интерфейс для взаимодействия с одним из агентов выполнения, используемых для проверки состояния приложения и прослушивания событий выполнения.
Пример использования
Помимо отладчика, доступны различные профилировщики 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-v16.x/docs/api/inspector.html