V8 インスペクタープロトコルを使用してデバッグする
V8 は、ユーザーとエンベダーの両方に広範なデバッグ機能を提供します。ユーザーは、通常、Chrome DevTools インターフェイスを介して V8 デバッガーと対話します。エンベダー(DevTools を含む)は、インスペクタープロトコルに直接依存する必要があります。
このページは、エンベダーが必要な基本的なツールを V8 でデバッグサポートを実装するために提供することを目的としています。
インスペクターに接続する #
V8 の コマンドラインデバッグシェル d8
には、InspectorFrontend
と InspectorClient
を使用した簡易なインスペクター統合が含まれます。クライアントは、エンベダーから V8 に送信されるメッセージ用の通信チャネルを設定します
static void SendInspectorMessage(
const v8::FunctionCallbackInfo<v8::Value>& args) {
// [...] Create a StringView that Inspector can understand.
session->dispatchProtocolMessage(message_view);
}
一方、フロントエンドは sendResponse
と sendNotification
を実装して 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 ウィキは、使用可能なすべての関数の 完全なドキュメント を提供します。