通过 V8 Inspector 协议进行调试
V8 为用户和嵌入器提供了广泛的调试功能。用户通常会通过 Chrome DevTools 接口与 V8 调试器进行交互。嵌入器(包括 DevTools)需要直接依赖于 Inspector 协议。
本页面旨在为嵌入器提供在 V8 中实现调试支持所需的必要工具。
连接到 Inspector #
V8 的 命令行调试 shell d8
通过 InspectorFrontend
和 InspectorClient
包含一个简单的 Inspector 集成。客户端为从嵌入器发送到 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);
}
}
使用 Inspector 协议 #
继续我们的示例,d8
将 Inspector 消息转发到 JavaScript。以下代码实现了与 Inspector 通过 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'.
进一步的文档 #
Inspector API 使用的更详细示例可在 test-api.js
中找到,该示例实现了 V8 测试套件使用的简单调试 API。
V8 还包含一个备用的 Inspector 集成,位于 inspector-test.cc
中。
Chrome DevTools wiki 提供了 所有可用函数的完整文档。