Présentation de l'outil d'inspection de mémoire

Kim-Anh Tran
Kim-Anh Tran

Cet article présente l'outil d'inspection de mémoire qui est disponible dans Chrome 91. Il vous permet d'inspecter vos objets ArrayBuffer, TypedArray, DataView et Wasm.

Introduction

Vous avez toujours rêvé de donner un sens aux données de votre ArrayBuffer ? Avant l'outil d'inspection de mémoire, les outils de développement ne permettaient d'obtenir qu'un aperçu limité des ArrayBuffers. L'inspection à partir de la vue Champ d'application lors d'une session de débogage se limitait à l'affichage d'une liste de valeurs uniques dans le tampon du tableau, ce qui rendait difficile l'interprétation des données dans leur ensemble. Par exemple, la vue Scope affiche le tampon sous la forme de plages de tableaux extensibles dans l'exemple ci-dessous:

Vue du champ d'application dans les outils de développement

Accéder à une certaine plage dans le tampon constituait une difficulté, car l'utilisateur devait faire défiler la page vers le bas pour accéder enfin à cet index. Cependant, même s'il est facile d'accéder à une position, cette méthode d'inspecting des valeurs est fastidieuse: il est difficile de déterminer la signification de ces chiffres. Surtout, que se passe-t-il s'ils ne doivent pas être interprétés comme des octets uniques, mais comme des entiers 32 bits ?

Inspecter des valeurs à l'aide de l'outil d'inspection de mémoire

Outil d'inspection de mémoire

Avec Chrome 91, nous lançons l'outil d'inspection de mémoire, un outil permettant d'inspecter les tampons de tableau. Vous avez peut-être déjà vu des outils d'inspection de la mémoire permettant d'afficher des données binaires, qui affichent le contenu binaire dans une grille avec leurs adresses et offrent différentes façons d'interpréter les valeurs sous-jacentes. Voici les informations fournies par l'outil d'inspection de mémoire. Avec l'outil d'inspection de mémoire, vous pouvez désormais afficher le contenu, le parcourir et sélectionner les types à utiliser pour interpréter les valeurs concernées. Il affiche les valeurs ASCII directement à côté des octets et permet à l'utilisateur de sélectionner un objectif différent. Découvrez l'outil d'inspection de mémoire ci-dessous:

Pour essayer, Pour savoir comment ouvrir l'outil d'inspection de mémoire et afficher le tampon de votre tableau (ou TypedArray, DataView ou Wasm Memory), et pour en savoir plus sur son utilisation, consultez notre documentation sur l'outil d'inspection de mémoire. Essayez-le avec ces exemples de jouets (pour JS, Wasm et C++).

Concevoir l'outil d'inspection de mémoire

Dans cette partie, nous verrons comment l'outil d'inspection de mémoire est conçu à l'aide de composants Web, puis nous vous présenterons l'un de nos objectifs de conception et la façon dont nous l'avons mis en œuvre. Si vous souhaitez en savoir plus, consultez notre document de conception pour l'outil d'inspection de mémoire.

Vous avez peut-être lu notre article de blog sur la migration vers les composants Web, dans lequel Jack a publié notre guide interne sur la création de composants d'interface utilisateur à l'aide de composants Web. La migration vers les composants Web a coïncidé avec notre travail sur l'outil d'inspection de mémoire. Nous avons donc décidé d'essayer le nouveau système. Le schéma ci-dessous présente les composants que nous avons créés pour créer l'outil d'inspection de mémoire (notez que nous l'appelons en interne l'outil d'inspection de mémoire linéaire):

Composants Web

Le composant LinearMemoryInspector est le composant parent qui combine les sous-composants qui constituent tous les éléments de l'outil d'inspection de mémoire. Il utilise essentiellement un Uint8Array et un address, et, à chaque modification, il propage les données à ses enfants, ce qui déclenche un nouveau rendu. Le LinearMemoryInspector lui-même affiche trois sous-composants:

  1. LinearMemoryViewer (affichage des valeurs),
  2. LinearMemoryNavigator (permettant la navigation) et
  3. LinearMemoryValueInterpreter (affichage de différentes interprétations de type des données sous-jacentes).

Ce dernier est lui-même un composant parent, qui affiche le ValueInterpreterDisplay (affichage des valeurs) et le ValueInterpreterSettings (qui sélectionne les types à afficher).

Chacun des composants est conçu pour ne représenter qu'un seul petit composant de l'interface utilisateur, de sorte qu'il puisse être réutilisé si nécessaire. Chaque fois que de nouvelles données sont définies sur un composant, un nouveau rendu est déclenché, ce qui montre la modification apportée aux données définies dans le composant. Vous trouverez ci-dessous un exemple de workflow avec nos composants. L'utilisateur modifie l'adresse dans la barre d'adresse, ce qui déclenche une mise à jour en définissant les nouvelles données (dans ce cas, l'adresse à afficher) :

Schéma des composants

Le LinearMemoryInspector s'ajoute en tant qu'écouteur sur le LinearMemoryNavigator. La fonction addressChanged doit être déclenchée lors d'un événement address-changed. Dès que l'utilisateur modifie l'entrée d'adresse, l'événement susmentionné est envoyé, de sorte que la fonction addressChanged est appelée. Cette fonction enregistre maintenant l'adresse en interne et met à jour ses sous-composants à l'aide du setter data(address, ..). Les sous-composants enregistrent l'adresse en interne et affichent à nouveau leurs vues, montrant le contenu à cette adresse particulière.

Objectif de conception: rendre les performances et la consommation de mémoire indépendantes de la taille de la mémoire tampon

Lors de la conception de l'outil d'inspection de mémoire, nous avions pensé que ses performances devaient être indépendantes de la taille de la mémoire tampon.

Comme vous l'avez vu dans la partie précédente, le composant LinearMemoryInspector utilise un élément UInt8Array pour afficher les valeurs. Nous voulions également nous assurer que l'outil d'inspection de mémoire n'aurait pas besoin de conserver l'intégralité des données, car il n'en montre qu'une partie (par exemple, la mémoire Wasm peut atteindre 4 Go, et nous ne voulons pas stocker 4 Go dans l'outil d'inspection de mémoire).

Ainsi, pour nous assurer que la vitesse et la consommation de mémoire de l'outil d'inspection de mémoire sont indépendantes du tampon réel que nous affichons, nous laissons au composant LinearMemoryInspector ne conserver qu'une sous-plage du tampon d'origine.

Pour que cela fonctionne, LinearMemoryInspector doit d'abord accepter deux autres arguments: memoryOffset et outerMemoryLength. memoryOffset indique le décalage à partir duquel l'Uint8Array transmis commence, et est nécessaire pour afficher les adresses de données correctes. outerMemoryLength est la longueur du tampon d'origine. Elle est nécessaire pour comprendre la plage que nous pouvons afficher:

mise en mémoire tampon

Grâce à ces informations, nous pouvons faire en sorte d'afficher la même vue qu'auparavant (le contenu autour de address), sans avoir toutes les données en place. Que faire si une adresse différente est demandée, mais qu'elle appartient à une plage différente ? Dans ce cas, LinearMemoryInspector déclenche une RequestMemoryEvent, qui met à jour la plage actuelle qui est conservée. Voici un exemple:

Schéma illustrant le flux du déclencheur d'événements

Dans cet exemple, l'utilisateur parcourt la page de la mémoire (l'outil d'inspection de mémoire utilise la pagination pour afficher des fragments de données), ce qui déclenche une PageNavigationEvent, qui déclenche elle-même une RequestMemoryEvent. Cet événement lance la récupération de la nouvelle plage, qui est ensuite propagée au composant LinearMemoryInspector via la définition des données. Par conséquent, nous affichons les données nouvellement récupérées.

Oh, et le saviez-vous ? Vous pouvez même inspecter la mémoire dans les codes Wasm et C/C++

L'outil d'inspection de mémoire n'est pas seulement disponible pour ArrayBuffers en JavaScript, mais il peut également être utilisé pour inspecter la mémoire Wasm et la mémoire vers laquelle les références/pointeurs C/C++ font référence (à l'aide de notre extension DWARF. Si vous ne l'avez pas encore fait, essayez-la). Consultez Déboguer WebAssembly avec des outils modernes. Aperçu de l'outil d'inspection de mémoire pour le débogage natif de C++ sur le Web:

Inspecter la mémoire en C++

Conclusion

Cet article présentait l'outil d'inspection de mémoire et en donnait un aperçu. Nous espérons que l'outil d'inspection de mémoire vous aidera à comprendre ce qui se passe dans votre ArrayBuffer :-). Si vous avez des suggestions d'amélioration, n'hésitez pas à nous contacter et à signaler un bug.

Télécharger les canaux de prévisualisation

Nous vous conseillons d'utiliser Chrome Canary, Dev ou Beta comme navigateur de développement par défaut. Ces versions preview vous permettent d'accéder aux dernières fonctionnalités des outils de développement, de tester des API de pointe de plates-formes Web et de détecter les problèmes sur votre site avant qu'ils ne le fassent.

Contacter l'équipe des outils pour les développeurs Chrome

Utilisez les options suivantes pour discuter des nouvelles fonctionnalités et des modifications dans l'article, ou de toute autre question concernant les outils de développement.

  • Envoyez-nous une suggestion ou des commentaires via crbug.com.
  • Signalez un problème dans les outils de développement via Plus d'options   More > Aide > Signaler un problème dans les outils de développement dans les Outils de développement.
  • Envoyez un tweet à @ChromeDevTools.
  • Dites-nous en plus sur les nouveautés concernant les vidéos YouTube dans les outils de développement ou sur les vidéos YouTube de nos conseils relatifs aux outils de développement.