Depuración mediante el protocolo V8 Inspector
V8 ofrece funcionalidades extensivas de depuración tanto a usuarios como a integradores. Los usuarios habitualmente interactúan con el depurador de V8 a través de la interfaz de Chrome DevTools. Los integradores (incluyendo DevTools) necesitan depender directamente del Protocolo de Inspector.
Esta página está destinada a proporcionar a los integradores las herramientas básicas que necesitan para implementar soporte de depuración en V8.
Conectándose al Inspector
La consola de depuración de línea de comandos d8
de V8 incluye una integración simple con el inspector mediante el InspectorFrontend
y InspectorClient
. El cliente establece un canal de comunicación para los mensajes enviados desde el integrador a V8:
static void SendInspectorMessage(
const v8::FunctionCallbackInfo<v8::Value>& args) {
// [...] Crear un StringView que el Inspector pueda entender.
session->dispatchProtocolMessage(message_view);
}
Mientras tanto, el frontend establece un canal para los mensajes enviados de V8 al integrador implementando sendResponse
y sendNotification
, que luego reenvían a:
void Send(const v8_inspector::StringView& string) {
// [...] Transformaciones de cadena.
// Obtener la propiedad global llamada 'receive' del contexto actual.
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();
// Y llamarlo para pasar el mensaje a JS.
if (callback->IsFunction()) {
// [...]
MaybeLocal<Value> result = Local<Function>::Cast(callback)->Call(
context, Undefined(isolate_), 1, args);
}
}
Usando el Protocolo del Inspector
Continuando con nuestro ejemplo, d8
reenvía los mensajes del inspector a JavaScript. El siguiente código implementa una interacción básica, pero completamente funcional, con el Inspector a través de d8
:
// inspector-demo.js
// Función receptora llamada por d8.
function receive(message) {
print(message)
}
const msg = JSON.stringify({
id: 0,
method: 'Debugger.enable',
});
// Llamar a la función proporcionada por d8.
send(msg);
// Ejecutar este archivo con el comando 'd8 --enable-inspector inspector-demo.js'.
Documentación adicional
Un ejemplo más desarrollado del uso de la API del Inspector está disponible en test-api.js
, que implementa una API de depuración simple para el uso en la suite de pruebas de V8.
V8 también contiene una integración alternativa del Inspector en inspector-test.cc
.
El wiki de Chrome DevTools proporciona documentación completa de todas las funciones disponibles.