Lorsque je parle de débogage de la mémoire, la première chose qui vient à l’esprit de nombreux développeurs est le profileur. Ce n’est pas faux, mais c’est encore une image partielle. Les profileurs sont incroyables pour cartographier cette « vue d’ensemble », mais lorsque vous voulez comprendre le domaine, ils échouent.
Les débogueurs modernes nous permettent d’acquérir un niveau de compréhension de l’application inégalé. Nous pouvons inspecter et localiser une instance d’objet spécifique avec une précision chirurgicale.
Transcription
Bienvenue dans la huitième partie du débogage à grande échelle, où nous savons exactement quel objet a été alloué par qui et pourquoi.
Profileur vs débogueur
Les profileurs exposent beaucoup d’informations sur la mémoire, mais ils ne nous donnent pas la vue détaillée qu’offre un débogueur. Le débogueur peut résoudre ce problème du dernier kilomètre ; il peut connecter les informations que vous voyez dans le débogueur aux modifications réelles et exploitables que vous devez apporter au code.
Le débogueur complète parfaitement les idées du profileur. Dans le débogueur, nous pouvons identifier des objets spécifiques et des emplacements de mémoire. Un profileur est un instrument contondant, et le débogueur est un excellent. En combinant les deux, nous pouvons zoomer sur un problème spécifique et comprendre la cause première.
Affichage de la mémoire consultable
Nous allons commencer par lancer la vue mémoire de l’IDE. Nous pouvons activer la vue mémoire en cliquant sur le widget sur le côté droit de l’IDE ici. Une fois que nous avons cliqué dessus, nous pouvons voir la vue de la mémoire dans la même zone. Notez que la vue mémoire est vide par défaut même après son lancement. Cela permet à l’IDE de rester réactif. Afin de voir les objets réels en mémoire, nous devons cliquer sur le lien de chargement au centre. Une fois chargé, nous pouvons voir le nombre d’instances pour chaque objet. Cela nous aide à avoir une idée de ce qui occupe exactement la mémoire.
Mais ce n’est qu’une partie de l’histoire. Lorsque nous franchissons le pas, des allocations sont en cours. Nous pouvons voir la différence entre le point actuel et celui d’avant lorsque nous regardons la colonne diff. Remarquez quand je dis « point », je veux dire soit la ligne avant avec un pas en avant, mais cela peut aussi s’appliquer pour appuyer sur continuer entre deux points d’arrêt. Dans ce cas, je peux voir que la ligne que j’ai franchie a déclenché l’allocation de tableaux de 70 octets. Cela peut sembler beaucoup, mais l’EDI ne peut pas distinguer les threads et un graphe d’appels profond, nous devons donc prendre le nombre avec un grain de sel.
Nous pouvons double-cliquer sur une entrée individuelle et voir toutes les instances de l’objet donné, ce qui est une fonctionnalité remarquablement puissante. Je vais creuser un peu plus dans cette fonctionnalité assez tôt. Pour rappel, nous pouvons filtrer les objets que nous voyons ici en utilisant le champ en haut de la boîte de dialogue et localiser n’importe quel objet en mémoire. C’est un outil très puissant.
Mettre à jour les classes chargées
Cliquer sur charger des classes à chaque fois est fastidieux. J’ai une machine rapide avec beaucoup de RAM. Je peux activer « Mettre à jour les classes chargées à l’arrêt du débogueur » et je n’aurai plus besoin d’appuyer explicitement sur load. Ne le faites que si votre machine est un monstre, car cela ralentira considérablement vos sessions de débogage. J’active ceci ici parce que je pense que cela rendra la vidéo plus claire.
Suivre les nouvelles instances
Vous avez peut-être remarqué cette zone sur le côté droit de la vue de l’instance. Nous pouvons l’activer avec l’option de suivi des nouvelles instances. Cette option nous permet de suivre explicitement les allocations individuelles qui se déroulent entre deux points. Nous pouvons l’activer en cliquant avec le bouton droit sur n’importe quel objet non-tableau et en activant cette option comme nous le faisons ici.
Une fois activé, nous voyons un petit signe de montre à côté de l’objet suivi, mais il y a beaucoup plus impliqué alors que nous continuons l’exécution. Je ne peux maintenant voir que les objets alloués dans ce diff. Nous pouvons comprendre exactement ce qui s’est passé en termes de RAM avec beaucoup de détails. Notez qu’ici, je peux voir le nombre exact d’éléments qui ont été alloués ici. Il y en avait beaucoup car j’ai fait une longue pause d’attente avant d’enjamber. En cliquant sur Afficher les nouvelles instances, j’obtiens une version spéciale de la boîte de dialogue des instances.
Dans cette version de la boîte de dialogue, je ne vois que les nouvelles instances créées. L’IDE sait exactement quels objets ont été créés entre le dernier arrêt sur un point d’arrêt et maintenant. Il ne me montre que ces objets. Pour chacun des objets individuels, je peux voir la trace de la pile qui l’a déclenché jusqu’à l’appel littéral à new.
Je peux comprendre qui a créé chaque objet et suivre la logique pour laquelle un objet a été créé. Je peux double-cliquer sur une entrée dans la pile et accéder au code source applicable. C’est un niveau de perspicacité fantastique.
Étapes et points d’arrêt
J’en ai déjà parlé, mais ces mises à jour ne fonctionnent pas seulement pour le pas en avant. Tout ce que j’ai montré fonctionne exactement de la même manière en sautant entre deux points d’arrêt. Même s’ils sont dans des méthodes distinctes, la différence sera entre ces deux points.
C’est très puissant. Vous pouvez lentement réduire l’écart entre deux points à mesure que vous découvrez quelle zone du code occupe de la mémoire. Notez que l’allocation de mémoire est directement liée aux performances, car la récupération de place est une source majeure de surcharge de performances. Cela nous permet de réduire la cause profonde.
Dernier mot
Dans la vidéo suivante, nous aborderons le débogage à distance et ses risques. Je sais ce que vous pourriez penser; Je sais déjà utiliser le débogage à distance. Ceci est une vidéo différente, nous discuterons du tunneling, du transfert de port et des risques liés à tout cela. Si vous avez des questions, veuillez utiliser la section des commentaires. Merci!