Depuração pelo V8 Inspector Protocol
O V8 oferece ampla funcionalidade de depuração para usuários e embutidores. Normalmente, os usuários interagem com o depurador V8 através da interface Chrome DevTools. Os embutidores (incluindo DevTools) precisam contar diretamente com o Inspector Protocol.
Esta página tem o objetivo de fornecer aos embutidores as ferramentas básicas necessárias para implementar suporte à depuração no V8.
Conectando ao Inspector
O shell de depuração na linha de comando do V8 d8
inclui uma integração simples com o inspector por meio do InspectorFrontend
e InspectorClient
. O cliente configura um canal de comunicação para mensagens enviadas do embutidor para o V8:
static void SendInspectorMessage(
const v8::FunctionCallbackInfo<v8::Value>& args) {
// [...] Cria um StringView que o Inspector possa entender.
session->dispatchProtocolMessage(message_view);
}
Enquanto isso, o frontend estabelece um canal para mensagens enviadas do V8 para o embutidor ao implementar sendResponse
e sendNotification
, que então se encaminham para:
void Send(const v8_inspector::StringView& string) {
// [...] Transformações de string.
// Obtém a propriedade global chamada 'receive' do contexto atual.
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();
// E chama essa função para passar a mensagem ao JS.
if (callback->IsFunction()) {
// [...]
MaybeLocal<Value> result = Local<Function>::Cast(callback)->Call(
context, Undefined(isolate_), 1, args);
}
}
Usando o Inspector Protocol
Continuando com o nosso exemplo, d8
encaminha mensagens do inspector ao JavaScript. O código abaixo implementa uma interação básica, mas totalmente funcional com o Inspector por meio do d8
:
// inspector-demo.js
// Função receptora chamada pelo d8.
function receive(message) {
print(message)
}
const msg = JSON.stringify({
id: 0,
method: 'Debugger.enable',
});
// Chama a função fornecida pelo d8.
send(msg);
// Execute este arquivo com o comando 'd8 --enable-inspector inspector-demo.js'.
Documentação adicional
Um exemplo mais elaborado de uso da API do Inspector está disponível em test-api.js
, que implementa uma API de depuração simples para uso na suíte de testes do V8.
O V8 também contém uma integração alternativa com o Inspector em inspector-test.cc
.
A wiki do Chrome DevTools fornece documentação completa de todas as funções disponíveis.