Pular para o conteúdo principal

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.