Перейти к основному содержимому

Отладка через протокол V8 Inspector

V8 предоставляет обширные возможности отладки как для пользователей, так и для внедряющих. Пользователи обычно взаимодействуют с отладчиком V8 через интерфейс Chrome DevTools. Внедряющие (включая DevTools) должны напрямую полагаться на Inspector Protocol.

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

Подключение к Inspector

Командная оболочка d8 в V8 включает простую интеграцию с Inspector через InspectorFrontend и InspectorClient. Клиент создает канал связи для передачи сообщений от внедряющего пользователя к V8:

static void SendInspectorMessage(
const v8::FunctionCallbackInfo<v8::Value>& args) {
// [...] Создаем StringView, понятный Inspector.
session->dispatchProtocolMessage(message_view);
}

Между тем, фронтенд создает канал для передачи сообщений от V8 к внедряющему пользователю, реализуя sendResponse и sendNotification, которые затем перенаправляются:

void Send(const v8_inspector::StringView& string) {
// [...] Трансформация строки.
// Получаем глобальное свойство с названием 'receive' из текущего контекста.
Local<String> callback_name =
v8::String::NewFromUtf8(isolate_, "receive", v8::NewStringType::kNormal)
.ToLocalChecked();
Local<Context> context = context_.Get(isolate_);
Local<Value> callback =
context->Global()->Get(context, callback_name).ToLocalChecked();
// И вызываем его для передачи сообщения в JS.
if (callback->IsFunction()) {
// [...]
MaybeLocal<Value> result = Local<Function>::Cast(callback)->Call(
context, Undefined(isolate_), 1, args);
}
}

Использование протокола Inspector

Продолжая наш пример, d8 перенаправляет сообщения от Inspector в JavaScript. Следующий код реализует базовое, но полностью функциональное взаимодействие с Inspector через d8:

// inspector-demo.js
// Функция-получатель, вызываемая d8.
function receive(message) {
print(message)
}

const msg = JSON.stringify({
id: 0,
method: 'Debugger.enable',
});

// Вызываем функцию, предоставленную d8.
send(msg);

// Запустите этот файл, введя команду 'd8 --enable-inspector inspector-demo.js'.

Дополнительная документация

Более детализированный пример использования API Inspector доступен в test-api.js, который реализует простой API отладки для использования тестового набора V8.

V8 также содержит альтернативную интеграцию Inspector в inspector-test.cc.

Wiki Chrome DevTools предоставляет полную документацию для всех доступных функций.