V8 インスペクタープロトコルを使用してデバッグする

V8 は、ユーザーとエンベダーの両方に広範なデバッグ機能を提供します。ユーザーは、通常、Chrome DevTools インターフェイスを介して V8 デバッガーと対話します。エンベダー(DevTools を含む)は、インスペクタープロトコルに直接依存する必要があります。

このページは、エンベダーが必要な基本的なツールを V8 でデバッグサポートを実装するために提供することを目的としています。

インスペクターに接続する #

V8 の コマンドラインデバッグシェル d8 には、InspectorFrontendInspectorClient を使用した簡易なインスペクター統合が含まれます。クライアントは、エンベダーから V8 に送信されるメッセージ用の通信チャネルを設定します

static void SendInspectorMessage(
const v8::FunctionCallbackInfo<v8::Value>& args) {
// [...] Create a StringView that Inspector can understand.
session->dispatchProtocolMessage(message_view);
}

一方、フロントエンドは sendResponsesendNotification を実装して V8 からエンベダーに送信されるメッセージ用のチャネルを確立し、次に次へ転送します

void Send(const v8_inspector::StringView& string) {
// [...] String transformations.
// Grab the global property called 'receive' from the current context.
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();
// And call it to pass the message on to JS.
if (callback->IsFunction()) {
// [...]
MaybeLocal<Value> result = Local<Function>::Cast(callback)->Call(
context, Undefined(isolate_), 1, args);
}
}

インスペクタープロトコルを使用する #

例を続けると、d8 はインスペクターメッセージを JavaScript に転送します。以下のコードは、d8 を使用したインスペクターとの基本的な全機能の対話を実装します

// inspector-demo.js
// Receiver function called by d8.
function receive(message) {
print(message)
}

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

// Call the function provided by d8.
send(msg);

// Run this file by executing 'd8 --enable-inspector inspector-demo.js'.

詳細なドキュメント #

インスペクター API の使用に関するより具体的な例は test-api.js で利用でき、V8 のテストスイートで使用するための簡易デバッグ API を実装します。

V8 には inspector-test.cc で代替のインスペクター統合も含まれています。

Chrome DevTools ウィキは、使用可能なすべての関数の 完全なドキュメント を提供します。