Zum Hauptinhalt springen

Debuggen über das V8-Inspector-Protokoll

V8 bietet sowohl für Benutzer als auch für Embeds umfassende Debugging-Funktionen. Benutzer interagieren normalerweise über die Chrome DevTools-Schnittstelle mit dem V8-Debugger. Embeds (einschließlich DevTools) müssen direkt auf das Inspector-Protokoll zurückgreifen.

Diese Seite soll Embeds die grundlegenden Werkzeuge bereitstellen, die sie benötigen, um Debugging-Unterstützung in V8 zu implementieren.

Verbindung zum Inspector herstellen

Die Befehlszeilendebug-Shell d8 von V8 enthält eine einfache Inspector-Integration durch InspectorFrontend und InspectorClient. Der Client richtet einen Kommunikationskanal für Nachrichten ein, die vom Embedder an V8 gesendet werden:

static void SendInspectorMessage(
const v8::FunctionCallbackInfo<v8::Value>& args) {
// [...] Erstellen Sie eine StringView, die der Inspector verstehen kann.
session->dispatchProtocolMessage(message_view);
}

In der Zwischenzeit richtet das Frontend einen Kanal für Nachrichten ein, die von V8 an den Embedder gesendet werden, indem sendResponse und sendNotification implementiert werden, die dann an:

void Send(const v8_inspector::StringView& string) {
// [...] String-Transformationen.
// Abrufen der globalen Eigenschaft namens 'receive' aus dem aktuellen Kontext.
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();
// Und rufen Sie es auf, um die Nachricht an JS weiterzuleiten.
if (callback->IsFunction()) {
// [...]
MaybeLocal<Value> result = Local<Function>::Cast(callback)->Call(
context, Undefined(isolate_), 1, args);
}
}

Verwendung des Inspector-Protokolls

Fortsetzung unseres Beispiels: d8 leitet Inspector-Nachrichten an JavaScript weiter. Der folgende Code implementiert eine grundlegende, aber vollständig funktionsfähige Interaktion mit dem Inspector über d8:

// inspector-demo.js
// Empfängerfunktion, die von d8 aufgerufen wird.
function receive(message) {
print(message)
}

const msg = JSON.stringify({
id: 0,
method: 'Debugger.enable',
});

// Funktion aufrufen, die von d8 bereitgestellt wird.
send(msg);

// Führen Sie diese Datei aus, indem Sie 'd8 --enable-inspector inspector-demo.js' ausführen.

Weitere Dokumentation

Ein ausführlicheres Beispiel für die Verwendung der Inspector-API finden Sie unter test-api.js, das eine einfache Debugging-API für die Verwendung durch V8’s Test-Suite implementiert.

V8 enthält auch eine alternative Inspector-Integration unter inspector-test.cc.

Das Chrome-DevTools-Wiki bietet vollständige Dokumentation über alle verfügbaren Funktionen.