メインコンテンツまでスキップ

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

V8は、ユーザーおよび埋め込み者の両方に対して広範なデバッグ機能を提供します。ユーザーは通常、Chrome DevToolsインターフェースを通じてV8デバッガを操作します。埋め込み者(DevToolsを含む)は、Inspector Protocolを直接利用する必要があります。

このページは、V8におけるデバッグサポートを実装するために必要な基本的なツールを埋め込み者に提供することを目的としています。

インスペクタへの接続

V8のコマンドラインデバッグシェルd8は、InspectorFrontendおよびInspectorClientを通じて簡単なインスペクタ統合を含んでいます。クライアントは、埋め込み者からV8へ送信されるメッセージの通信チャネルを設定します:

static void SendInspectorMessage(
const v8::FunctionCallbackInfo<v8::Value>& args) {
// [...] Inspectorが理解できるStringViewを作成します。
session->dispatchProtocolMessage(message_view);
}

一方で、フロントエンドは、sendResponseおよびsendNotificationを実装して、V8から埋め込み者に送信されるメッセージのチャネルを確立し、以下に転送します:

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);
}
}

インスペクタープロトコルの使用

例を続けると、d8はインスペクタメッセージをJavaScriptに転送します。以下のコードは、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の使用例として、test-api.jsがあり、これはV8のテストスイートで使用するための単純なデバッグAPIを実装しています。

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

Chrome DevToolsのWikiでは、利用可能なすべての機能についての完全なドキュメントが提供されています。