Dans Chrome 92, nous avons lancé l'outil d'inspection de la mémoire, qui permet d'inspecter les tampons de mémoire linéaires. Dans cet article, nous verrons comment nous avons amélioré l'outil d'inspection pour le débogage C/C++ et les difficultés techniques rencontrées.
Voici quelques articles de blog pertinents si vous débutez avec le débogage C/C++ et l'outil d'inspection de la mémoire:
- Vous vous intéressez au débogage de la mémoire profonde ? Consultez la section Présentation de l'outil d'inspection de mémoire.
- Vous souhaitez découvrir la suite complète d'outils de débogage C/C++ ? Consultez Déboguer WASM avec des outils modernes et Déboguer WebAssembly plus rapidement.
Introduction
L'outil d'inspection de mémoire fournit des options de débogage plus puissantes pour les tampons de mémoire linéaire. Dans le cas de C/C++, vous pouvez inspecter les objets mémoire C/C++ dans la mémoire WebAssembly.
La reconnaissance des octets de votre objet dans la mémoire WebAssembly environnante a posé problème. Vous devez connaître la taille de l'objet et le nombre d'octets à partir du début de l'objet. Dans la capture d'écran ci-dessous, le premier octet d'un tableau int32
à 10 éléments est sélectionné, mais les autres octets qui appartiennent au tableau ne sont pas immédiatement évidents. Ne serait-il pas agréable de pouvoir reconnaître instantanément tous les octets qui appartiennent à l'objet ?
Mise en surbrillance des objets dans l'outil d'inspection de mémoire
À partir de Chrome 107, l'outil d'inspection de mémoire met en évidence tous les octets d'un objet mémoire C/C++. Cela vous aide à les distinguer de la mémoire environnante.
Regardez la vidéo ci-dessous pour voir le fonctionnement de l'outil d'inspection de mémoire. Lorsque vous affichez le tableau x
dans l'outil d'inspection de mémoire, la mémoire en surbrillance apparaît dans la visionneuse de mémoire, avec un nouveau chip juste au-dessus. Ce chip vous rappelle le nom et le type du souvenir en surbrillance. Cliquez sur le chip pour accéder à la mémoire de l'objet. Si vous pointez sur le chip, une icône en forme de croix s'affiche. Cliquez dessus pour supprimer la mise en surbrillance.
Lorsque vous sélectionnez un octet en dehors de l'objet que vous inspectez, la mise en surbrillance se désactive pour ne pas vous distraire. Pour effectuer une nouvelle mise au point, cliquez à nouveau sur l'un des octets de l'objet ou sur le chip.
La mise en surbrillance des objets ne se limite pas aux tableaux. Vous pouvez également inspecter les structures, les objets et les pointeurs. Ces modifications facilitent plus que jamais l'exploration de la mémoire de vos applications C/C++.
Vous voulez essayer ? Voici ce que vous devez faire:
- vous utilisez Chrome 107 ou une version ultérieure ;
- Installez l'extension C/C++ DWARF.
- Activez le débogage DWARF dans DevTools > Paramètres > Tests > Débogage WebAssemble: activer la compatibilité DWARF
- Ouvrez cette page de démonstration.
- Suivez les instructions affichées sur la page.
Exemple de débogage
Dans cette section, nous allons examiner un bug factice pour illustrer comment utiliser l'outil d'inspection de la mémoire pour le débogage C/C++. Dans l'exemple de code ci-dessous, un programmeur crée un tableau d'entiers et décide d'utiliser l'arithmétique de pointeur pour sélectionner le dernier élément. Malheureusement, le programmeur a fait une erreur dans le calcul du pointeur et, au lieu d'imprimer le dernier élément, le programme imprime des valeurs incompréhensibles.
#include <iostream>
int main()
{
int numbers[] = {1, 2, 3, 4};
int *ptr = numbers;
int arraySize = sizeof(numbers)/sizeof(int);
int* lastNumber = ptr + arraySize; // Can you notice the bug here?
std::cout <<../ *lastNumber <<../ '\n';
return 0;
}
Le programmeur se tourne vers l'outil d'inspection de mémoire pour déboguer le problème. Vous pouvez suivre cette démonstration. Il inspecte d'abord le tableau dans l'outil d'inspection de mémoire et constate que le tableau numbers
ne contient que les entiers 1
, 2
, 3
et 4
, comme prévu.
Ensuite, ils révèlent la variable lastNumber
dans le volet Scope (Portée) et remarquent que le pointeur pointe vers un entier en dehors du tableau. Fort de ces connaissances, le programmeur se rend compte qu'il a mal compté le décalage du pointeur à la ligne 8. Il aurait dû être ptr + arraySize - 1
.
Bien qu'il s'agisse d'un exemple jouet, il illustre comment la mise en surbrillance des objets transmet efficacement la taille et la position des objets mémoire, ce qui peut vous aider à mieux comprendre ce qui se passe dans la mémoire de votre application C/C++.
Comment les outils de développement identifient les éléments à mettre en avant
Dans cette section, nous allons examiner l'écosystème d'outils qui permet le débogage C/C++. Plus précisément, vous apprendrez comment les outils de développement, V8, l'extension DWARF C/C++ et Emscripten permettent d'effectuer le débogage C/C++ dans Chrome.
Pour exploiter tout le potentiel du débogage C/C++ dans les outils de développement, vous avez besoin de deux choses:
- L'extension DWARF C/C++ installée dans Chrome
- Fichiers sources C/C++ compilés sur WebAssembly avec le dernier compilateur Emscripten, comme indiqué dans cet article de blog
Mais pourquoi ? V8 , le moteur JavaScript et WebAssembly de Chrome, ne sait pas exécuter C ou C++. Grâce à Emscripten, un compilateur C/C++ vers WebAssembly, vous pouvez compiler des applications compilées en C ou C++ en tant que WebAssembly et les exécuter dans le navigateur.
Lors de la compilation, emscripten intègre les données de débogage DWARF dans votre binaire. De manière générale, ces données aident l'extension à déterminer quelles variables WebAssembly correspondent à vos variables C/C++, etc. Ainsi, les outils de développement peuvent afficher vos variables C++ même si V8 exécute WebAssembly. Si vous êtes curieux, consultez cet article de blog pour obtenir un exemple de données de débogage DWARF.
Que se passe-t-il réellement lorsque vous affichez lastNumber
? Dès que vous cliquez sur l'icône de mémoire, les outils de développement vérifient quelle variable vous souhaitez inspecter. Elle interroge ensuite l'extension sur le type de données et l'emplacement de lastNumber
. Dès que l'extension répond avec ces informations, l'outil d'inspection de la mémoire peut afficher la tranche de mémoire pertinente. En connaissant son type, il peut également vous indiquer la taille de l'objet.
Si vous examinez lastNumber
dans l'exemple précédent, vous remarquerez peut-être que nous avons inspecté lastNumber: int *
, mais que le chip de l'outil d'inspection de la mémoire indique *lastNumber: int
. Qu'est-ce qui le donne ? L'outil d'inspection utilise un déréférencement de pointeur de style C++ pour indiquer le type d'objet qui vous est présenté. Si vous inspectez un pointeur, l'inspecteur vous indique vers quoi il pointe.
Conserver les temps forts des étapes du débogueur
Lorsque vous affichez un objet dans l'outil d'inspection de mémoire et que vous utilisez le débogueur, l'outil d'inspection conserve la mise en surbrillance s'il considère qu'il est toujours applicable. Au départ, cette fonctionnalité n'était pas prévue sur notre feuille de route, mais nous avons rapidement réalisé que cela compromet votre expérience de débogage. Imaginez que vous deviez inspecter à nouveau le tableau après chaque étape, comme dans la vidéo ci-dessous !
Lorsque le débogueur atteint un nouveau point d'arrêt, l'outil d'inspection de la mémoire interroge à nouveau V8 et l'extension pour rechercher la variable associée à la mise en surbrillance précédente. Elle compare ensuite les emplacements et les types des objets. Si elles correspondent, la mise en surbrillance persiste. La vidéo ci-dessus présente une écriture en boucle pour le tableau x
. Ces opérations ne modifient pas le type ni la position du tableau. Il reste donc en surbrillance.
Vous vous demandez peut-être comment cela affecte les pointeurs. Si vous avez un pointeur en surbrillance et que vous le réattribuez à un autre objet, l'ancienne et la nouvelle position des objets en surbrillance seront différentes, et la mise en surbrillance disparaît. Étant donné que l'objet nouvellement pointé peut résider n'importe où dans la mémoire WebAssembly et aura probablement peu de relation avec l'emplacement précédent de la mémoire, il est plus clair de supprimer la mise en surbrillance que de passer à un nouvel emplacement de mémoire. Vous pouvez à nouveau mettre en surbrillance le pointeur en cliquant sur son icône de mémoire dans le volet Champ d'application.
Conclusion
Cet article décrit les améliorations apportées à l'outil d'inspection de mémoire pour le débogage C/C++. Nous espérons que ces nouvelles fonctionnalités simplifieront le débogage de la mémoire de vos applications C/C++. Si vous avez des suggestions pour l'améliorer, n'hésitez pas à nous signaler un bug.
Étapes suivantes
Pour en savoir plus, consultez les sections suivantes :