Aller au contenu principal

Débogage via le protocole d'Inspecteur V8

V8 offre de nombreuses fonctionnalités de débogage aux utilisateurs et aux intégrateurs. Les utilisateurs interagissent généralement avec le débogueur V8 via l'interface Chrome DevTools. Les intégrateurs (y compris DevTools) doivent s'appuyer directement sur le protocole Inspecteur.

Cette page est destinée à fournir aux intégrateurs les outils de base dont ils ont besoin pour implémenter la prise en charge du débogage dans V8.

Connexion à l'Inspecteur

La console de débogage en ligne de commande d8 de V8 inclut une intégration simple de l'inspecteur via InspectorFrontend et InspectorClient. Le client configure un canal de communication pour les messages envoyés par l'intégrateur à V8 :

static void SendInspectorMessage(
const v8::FunctionCallbackInfo<v8::Value>& args) {
// [...] Créer une StringView que l'inspecteur peut comprendre.
session->dispatchProtocolMessage(message_view);
}

Pendant ce temps, le frontend établit un canal pour les messages envoyés de V8 à l'intégrateur en implémentant sendResponse et sendNotification, qui sont ensuite transmis à :

void Send(const v8_inspector::StringView& string) {
// [...] Transformations de chaîne.
// Récupérer la propriété globale appelée 'receive' du contexte actuel.
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();
// Et l'appeler pour transmettre le message à JS.
if (callback->IsFunction()) {
// [...]
MaybeLocal<Value> result = Local<Function>::Cast(callback)->Call(
context, Undefined(isolate_), 1, args);
}
}

Utilisation du protocole Inspecteur

En poursuivant avec notre exemple, d8 transmet les messages de l'inspecteur à JavaScript. Le code suivant implémente une interaction basique, mais entièrement fonctionnelle avec l'Inspecteur via d8 :

// inspector-demo.js
// Fonction receveuse appelée par d8.
function receive(message) {
print(message)
}

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

// Appeler la fonction fournie par d8.
send(msg);

// Exécutez ce fichier en exécutant 'd8 --enable-inspector inspector-demo.js'.

Documentation supplémentaire

Un exemple plus complet d'utilisation de l'API Inspecteur est disponible à test-api.js, qui implémente une API de débogage simple pour être utilisée par la suite de tests de V8.

V8 contient également une autre intégration Inspecteur à inspector-test.cc.

Le wiki de Chrome DevTools fournit une documentation complète de toutes les fonctions disponibles.