- Calculer un ensemble de compteurs liés à la mémoire qui peuvent être représentés graphiquement dans la vue Metrics.
- Construire une arborescence des piles d’allocation dans la vue Range Details.
- Afficher un graphique de la mémoire du titre utilisée dans la vue Timeline.
- Afficher la liste de toutes les allocations de mémoire par type de données.
- Construire une carte de toute la mémoire allouée et consultée. La carte mémoire ainsi que les filtres de données et les fonctionnalités d’analyse associés sont affichés dans la disposition Memory.
- Examinez les compteurs de la vue Metrics pour trouver les périodes pendant lesquelles un événement inattendu se produit, puis utilisez le menu contextuel de la vue Metrics pour accéder à cette période dans la vue Timeline et afficher l’arborescence des piles d’allocation.
- Sélectionnez des points dans la ligne Title Memory Used et comparez la répartition de la mémoire du titre à ces moments avec la répartition au début de la capture pour comprendre l’évolution de l’utilisation de la mémoire du titre au fil du temps.
- Examinez la quantité de remplissage dans diverses structures de données, à la recherche d’occasions de supprimer le remplissage inutile et de réduire ainsi la taille du type.
- Utilisez la disposition Memory pour trouver la mémoire allouée mais jamais consultée. Repérer de telles allocations peut aider à réduire l’empreinte mémoire globale.
Collecter des données d’allocation de mémoire et d’erreurs de page
Le volet des options de Timing Capture contient des cases à cocher qui vous permettent de choisir de collecter ou non des données mémoire pour les appels àVirtualAlloc, HeapAlloc, XMemAlloc et à tout allocateur personnalisé défini dans votre titre (figure 1). Les événements d’erreur de page peuvent également être collectés.
Figure 1. Options de collecte des données d’allocation de mémoire.

VirtualAlloc collecte également des données sur l’utilisation du pool du noyau. Pour afficher la ligne Title Memory Used dans la vue Timeline, vous devez cocher la case VirtualAlloc.
Pour collecter des données d’allocation de mémoire, sélectionnez les allocateurs à suivre, puis démarrez la capture.
Collecter des échantillons d’accès mémoire
PIX identifie les accès mémoire à partir d’échantillons. Chaque fois qu’un échantillon du processeur est collecté, PIX enregistre également les valeurs des registres du système. Ces valeurs de registre, ainsi que les PDB et les exécutables du titre, permettent de trouver les instructions du processeur qui entraînent des accès mémoire. Comme les accès sont identifiés par échantillonnage, des captures plus longues avec des fréquences d’échantillonnage plus élevées donnent une image plus complète des modèles d’accès mémoire d’un titre que des captures plus courtes avec une fréquence d’échantillonnage plus faible.Avant de collecter des échantillons d’accès mémoire, ajoutez les chemins des PDB et des exécutables du titre aux paramètres de chemin des symboles.

Compteurs mémoire dans la vue Metrics
Lorsqu’une ou plusieurs des options de collecte de mémoire sont activées, PIX recueille et calcule plusieurs compteurs liés à la mémoire et les ajoute à la vue Metrics. Trois ensembles de compteurs sont calculés.- Event Rate
- Memory Usage
- Unfreed allocations


VirtualAlloc.
Figure 4. Représentation d’un compteur d’utilisation de la mémoire.



VirtualAlloc, comme prévu. Développez l’Allocation Stack Tree pour trouver les piles d’appels responsables de la mémoire non libérée.
Outre les compteurs Event Rate, Memory Usage et Unfreed Allocations, la vue Metrics inclut également tous les compteurs liés à la mémoire disponibles dans System Monitor. Vous trouverez ces compteurs dans la section Title Memory du panneau Selector (figure 7).
Figure 7. Compteurs mémoire de System Monitor dans la vue Metrics.

Analyser les allocations de mémoire dans la vue Range Details
Lors de la collecte des données mémoire, PIX enregistre la pile d’appels de chaque allocation et de chaque libération de mémoire. PIX agrège ensuite les piles d’appels dans une arborescence globale des allocations. Pour afficher l’arborescence, sélectionnez une plage de temps dans la vue Timeline. Dans le menu déroulant Items to Show, sélectionnez Allocation Stack Tree (figure 8). L’arborescence des allocations affichée dans Range Details inclut toutes les allocations survenues dans la plage de temps sélectionnée. Figure 8. L’option Allocation Stack Tree dans la vue Range Details.
VirtualAlloc, Kernel Pool, HeapAlloc, XMemAlloc et Title Allocators. Ce regroupement sépare par exemple les allocations et libérations effectuées avec HeapAlloc de celles effectuées avec XMemAlloc. Utilisez le panneau Selector situé à gauche de la vue pour spécifier les allocateurs à afficher dans l’arborescence.
Un regroupement de second niveau dans l’arborescence permet de catégoriser davantage la mémoire selon des critères propres à chaque type d’allocateur.
- Les allocations
VirtualAllocsont regroupées par titre et par outils pour indiquer la partition dans laquelle l’allocation a été effectuée. - Les allocations Kernel Pool sont regroupées par balise de pool. Ces balises sont définies dans le fichier pooltag.txt, installé avec les composants de débogage du Windows 10 SDK. Après l’installation du SDK, vous trouverez pooltag.txt dans C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\triage sur votre PC de développement.
- Les allocations
HeapAllocsont regroupées par handle de tas afin que vous puissiez analyser l’utilisation de la mémoire tas par tas. - Les allocations
XMemAllocsont regroupées par type de mémoire. - Les Title Allocators sont regroupés par Allocator ID, l’ID étant la valeur du paramètre
allocatorIDtransmis à PIXRecordMemoryAllocationEvent.

LeakMemorySometimes a effectué 316 allocations de mémoire et que 3 481 272 320 octets de ces allocations n’avaient pas été libérés à la fin de la capture.
Figure 10. Développement d’une partie de l’arborescence des piles d’allocation.

LeakMemorySometimes a été appelée dans le cadre de deux piles d’appels distinctes. La première passe par la fonction Process, la seconde par UpdateEnemyPositions. La colonne Unfreed Size de ces deux fonctions indique que toute la mémoire non libérée provient de la première pile d’appels, celle qui inclut Process.
La sélection d’une fonction dans la vue Range Details renseigne la vue Element Details avec des informations supplémentaires sur la mémoire allouée et libérée par cette fonction. L’onglet Source Analysis affiche une liste du code source indiquant quelles lignes de la fonction ont alloué de la mémoire (figure 11).
Figure 11. La vue Element Details pour une fonction sélectionnée.




VirtualAlloc. Dans le menu déroulant Items to Show, sélectionnez Virtual Memory Allocations pour afficher la liste des allocations (figure 15). Par défaut, la liste est triée par heure et comprend des colonnes telles que Size, Unfreed Size et Flags.
Figure 15. Affichage des allocations de mémoire virtuelle.

Afficher les erreurs de page dans la chronologie
Les événements d’erreur de page sont dessinés sous forme de traits verticaux jaunes dans les lignes des threads et des cœurs de la Timeline. La sélection d’un événement d’erreur de page renseigne la vue Element Details avec des informations supplémentaires sur l’événement, notamment le type d’erreur de page et la pile d’appels qui l’a provoqué (figure 16).
Afficher les rapports d’utilisation de la mémoire à l’aide du graphique Title Memory Used
Si vous sélectionnez l’option de collecte des données sur les appels àVirtualAlloc avant de démarrer une capture, PIX crée une ligne nommée Title Memory Used qui contient un graphique de la quantité de mémoire du titre utilisée à différents points d’échantillonnage pendant la capture. Lors de sa création, la ligne Title Memory Used peut apparaître en bas de la capture. Vous pouvez utiliser le panneau Lane Configuration pour épingler la ligne ou la faire glisser vers le haut.
L’axe des y de la ligne Title Memory Used va de zéro à la quantité de mémoire du titre disponible sur la console. Survolez n’importe quel point de la ligne pour afficher la quantité de mémoire du titre utilisée à ce moment. La figure 17 montre la ligne Title Memory Used avec une info-bulle indiquant qu’environ 1 minute après le début de la capture, 4,3 Go de mémoire du titre sont utilisés. Dans ce cas, la quantité de mémoire du titre utilisée augmente régulièrement jusqu’à se stabiliser au maximum vers la fin de la capture.
Figure 17. La ligne Title Memory Used dans la vue Timeline.

- Mémoire validée
VirtualAlloc: la mémoire allouée par des appels àVirtualAllocavant le début de la capture n’est pas incluse dans ce total. - Utilisation des images : cette catégorie représente la mémoire utilisée pour stocker les images binaires de votre titre.
- Allocations de pages physiques : les allocations effectuées avant le début de la capture sont incluses dans ce total.
- Autre : la catégorie Other comprend la mémoire du titre utilisée pour stocker les entrées de table de pages, les listes de descripteurs de mémoire et d’autres petites allocations. Les allocations effectuées avant le début de la capture sont incluses dans ce total.
Dans les prochaines versions, le tableau Memory Usage Comparison sera étendu pour fournir une répartition plus détaillée de la catégorie Other.



Analyser les allocations de mémoire par type de données
Outre l’enregistrement d’informations sur les fonctions et les piles d’appels qui ont alloué de la mémoire, PIX enregistre également des informations sur les types de données alloués. Affichez la liste des types alloués en sélectionnant Type Allocations dans la liste déroulante Items to show de la vue Range Details. La liste des allocations est partitionnée par allocateur ; les types alloués par des appels à VirtualAlloc sont donc séparés des types alloués par HeapAlloc ou par tout allocateur personnalisé utilisé par le titre. La liste des allocations par type de données permet de voir le nombre d’allocations et la quantité de mémoire allouée pour chaque type de données. De plus, la liste des types de données indique la quantité de remplissage présente dans chaque type, ainsi que la quantité totale de mémoire occupée par ce remplissage. Connaître la quantité de remplissage permet de trouver des occasions d’éliminer le remplissage inutile, réduisant ainsi la taille du type de données et la quantité de mémoire utilisée. Les colonnes suivantes sont fournies dans la vue Range Details pour chaque type de données :- Allocation Count. Le nombre de fois où le type a été alloué.
- Size. La taille du type lui-même.
- Total Size. La quantité totale de mémoire occupée par toutes les allocations du type. Cette quantité est égale à Size multipliée par Allocation Count.
- Exc. Padding. La quantité de remplissage dans le type lui-même.
- Total Exc. Padding. La quantité totale de mémoire occupée par le remplissage pour toutes les allocations du type. Cette quantité est égale à Exc. Padding multiplié par Allocation Count.
- Name. Le nom du type.
- Inc. Padding. La quantité de remplissage dans le type lui-même, plus le remplissage de tous les types imbriqués.
- Total Inc. Padding. La quantité totale de mémoire occupée par le remplissage pour toutes les allocations du type, plus les allocations des types imbriqués. Cette quantité est égale à Inc. Padding multiplié par Allocation Count.


Analyser les accès mémoire à l’aide de la disposition Memory
La disposition Memory permet d’analyser les allocations, lectures et écritures de mémoire collectées lorsque la case Sample Memory Accesses est cochée avant le démarrage d’une Timing Capture. Les principaux éléments de l’interface utilisateur de la disposition Memory sont présentés dans la figure suivante et décrits dans la liste qui suit.
- Graphique Memory Usage. Un graphique de la quantité de mémoire CPU Title et de mémoire des objets d’API D3D utilisée sur la durée de la capture.
- Contrôles de démarrage de l’analyse. Un ensemble de contrôles d’interface utilisateur permettant de démarrer l’analyse de la mémoire.
- Indicateur de progression. Une barre de progression qui indique les étapes de l’analyse de la mémoire.
- Carte mémoire. Une carte de toutes les allocations de mémoire effectuées pendant la plage de temps sélectionnée.
- Filtres d’analyse. Les contrôles d’interface utilisateur permettant de filtrer la carte mémoire selon un ensemble de critères prédéfinis.
- Contrôle de démarrage de l’animation. Un contrôle permettant de démarrer l’animation nécessaire pour afficher les accès mémoire individuels.
- Panneau d’analyse. Le panneau d’analyse comporte deux onglets : Summary Analysis et Allocation Details. L’onglet Summary Analysis fournit un tableau croisé dynamique permettant d’analyser les données selon un ensemble de critères prédéfinis. La figure suivante montre un résumé des données croisé d’abord par Allocation Thread, puis par Designation.


Exécuter l’analyse de la mémoire
La carte mémoire n’est pas renseignée à l’ouverture initiale d’une capture. Pour la renseigner, sélectionnez une plage de temps dans le graphique Memory Usage, sélectionnez un type de mémoire dans la liste déroulante Memory Type et cliquez sur le bouton Analyze.


Analyser les échantillons d’accès mémoire
Des informations détaillées sur chaque accès mémoire, notamment un lien vers la chronologie au moment où l’accès s’est produit ainsi que sa pile d’appels, peuvent être obtenues en exécutant une animation de la mémoire sur la plage de temps sélectionnée. Utilisez le bouton Memory Animation pour exécuter l’animation. Pendant l’animation, PIX traite chaque accès mémoire dans l’ordre chronologique et met les accès en surbrillance dans la carte. Les lectures de mémoire sont mises en surbrillance d’une couleur et les écritures d’une autre. La figure suivante montre la carte mémoire pendant l’exécution d’une animation.

Le tableau croisé dynamique Summary Analysis
L’onglet Summary Analysis contient un tableau croisé dynamique permettant d’analyser la quantité totale de mémoire allouée dans la plage de temps sélectionnée. La quantité de mémoire allouée peut être croisée selon divers critères, notamment la balise XMem, le thread d’allocation, ainsi que les arborescences de piles d’appels et d’événements PIX. Dans la figure suivante, la quantité totale de mémoire allouée est croisée d’abord par thread, puis par les piles d’appels qui ont alloué la mémoire.

