Outil d’analyse du segment de mémoire (dotnet-gcdump)

Cet article s’applique à : ✔️ dotnet-gcdump version 3.1.57502 et versions ultérieures

Installer

Il existe deux façons de télécharger et d’installer dotnet-gcdump :

Notes

Pour utiliser dotnet-gcdump sur une application x86, vous avez besoin d’une version x86 correspondante de l’outil.

Synopsis

dotnet-gcdump [-h|--help] [--version] <command>

Description

L’outil dotnet-gcdump global collecte les images mémoire GC (Garbage Collector ou récupérateur de mémoire) des processus .NET en direct à l’aide d’EventPipe. Les images mémoires GC sont créées en déclenchant un GC dans le processus cible, en activant des événements spéciaux et en régénérant le graphique des racines d’objet à partir du flux d’événements. Ce processus permet de collecter les images mémoires GC pendant l’exécution du processus et avec une surcharge minimale. Ces images mémoires sont utiles pour plusieurs scénarios :

  • Comparaison du nombre d’objets sur le segment de mémoire à plusieurs moments dans le temps.
  • Analyse des racines d’objets (répondre à des questions telles que « qu’est-ce qui a encore une référence pour ce type ? »).
  • Collecte de statistiques générales sur le nombre d’objets sur le tas.

Afficher l’image mémoire GC capturée à partir de dotnet-gcdump

Sous Windows, les fichiers .gcdump peuvent être affichés dans PerfView à des fins d’analyse ou dans Visual Studio. Actuellement, il n’existe aucun moyen d’ouvrir un .gcdump sur des plateformes non Windows.

Vous pouvez collecter plusieurs .gcdump et les ouvrir simultanément dans Visual Studio pour les comparer.

Options

  • --version

    Affiche la version de l’utilitaire dotnet-gcdump.

  • -h|--help

    Affiche l’aide de la ligne de commande.

Commandes

Commande
dotnet-gcdump collect
dotnet-gcdump ps
dotnet-gcdump report

dotnet-gcdump collect

Collecte une image mémoire GC à partir d’un processus en cours d’exécution.

Avertissement

Pour parcourir le segment de mémoire GC, cette commande déclenche un nettoyage de la mémoire de génération 2 (complet), qui peut suspendre l’exécution pendant une longue période, en particulier lorsque le segment de mémoire GC est volumineux. N’utilisez pas cette commande dans les environnements sensibles aux performances lorsque le segment de mémoire GC est volumineux.

Synopsis

dotnet-gcdump collect [-h|--help] [-p|--process-id <pid>] [-o|--output <gcdump-file-path>] [-v|--verbose] [-t|--timeout <timeout>] [-n|--name <name>]

Options

  • -h|--help

    Affiche l’aide de la ligne de commande.

  • -p|--process-id <pid>

    ID de processus à partir duquel collecter l’image mémoire GC.

  • -o|--output <gcdump-file-path>

    Chemin d’accès où les images mémoires GC collectés doivent être écrites. La valeur par défaut est .\YYYYMMDD_HHMMSS_<pid>.gcdump.

  • -v|--verbose

    Sortez le journal lors de la collecte de l’image mémoire GC.

  • -t|--timeout <timeout>

    Abandonnez la collecte de l’image mémoire GC si cela prend plus de quelques secondes. La valeur par défaut est 30.

  • -n|--name <name>

    Nom du processus à partir duquel collecter l’image mémoire GC.

Notes

Sous Linux et macOS, cette commande s’attend à ce que l’application cible et dotnet-gcdump partagent la même variable d’environnement TMPDIR. Dans le cas contraire, la commande expire.

Notes

Pour collecter une image mémoire GC à l’aide de dotnet-gcdump, il faut l’exécuter en tant que même utilisateur que l’utilisateur exécutant le processus cible ou en tant que racine. Sinon, l’outil ne parvient pas à établir une connexion avec le processus cible.

dotnet-gcdump ps

Répertorie les processus dotnet pour lesquels les images mémoires GC peuvent être collectées. dotnet-gcdump 6.0.320703 et versions ultérieures affichent également les arguments de ligne de commande que chaque processus a démarrés, le cas échéant.

Synopsis

dotnet-gcdump ps [-h|--help]

Exemple

Supposons que vous démarriez une application de longue durée à l’aide de la commande dotnet run --configuration Release. Dans une autre fenêtre, vous exécutez la commande dotnet-gcdump ps . La sortie que vous verrez est la suivante. Les arguments de ligne de commande, le cas échéant, sont affichés à l’aide de la version 6.0.320703 ou ultérieure de dotnet-gcdump.

> dotnet-gcdump ps
  
  21932 dotnet     C:\Program Files\dotnet\dotnet.exe     run --configuration Release
  36656 dotnet     C:\Program Files\dotnet\dotnet.exe

dotnet-gcdump report <gcdump_filename>

Générez un rapport à partir d’une image mémoire GC générée précédemment ou d’un processus en cours d’exécution, puis écrivez dans stdout.

Synopsis

dotnet-gcdump report [-h|--help] [-p|--process-id <pid>] [-t|--report-type <HeapStat>]

Options

  • -h|--help

    Affiche l’aide de la ligne de commande.

  • -p|--process-id <pid>

    ID de processus à partir duquel collecter l’image mémoire GC.

  • -t|--report-type <HeapStat>

    Type de rapport à générer. Options disponibles : heapstat (valeur par défaut).

Dépanner

  • Il n’existe aucune information de type dans le gcdump.

    Avant .NET Core 3.1, il existait un problème où un cache de type n’était pas effacé entre les gcdumps lorsqu’ils étaient appelés avec EventPipe. Les événements nécessaires à la détermination des informations de type n’ont donc pas été envoyés pour le deuxième gcdump et les suivants. Cela a été résolu dans .NET Core 3.1-preview2.

  • Les types COM et statique ne sont pas dans l’image mémoire GC.

    Avant .NET Core 3.1, il existait un problème où les types statique et COM n’étaient pas envoyés lorsque l’image mémoire GC était appelée via EventPipe. Cela a été résolu dans .NET Core 3.1.

  • dotnet-gcdump ne peut pas générer un fichier .gcdump car il manque des informations, par exemple, [Erreur] Exception pendant gcdump : System.ApplicationException : le fichier ETL affiche le début d’une image mémoire du segment de mémoire, mais pas sa finalisation.. Ou bien, le fichier .gcdump n’inclut pas le segment de mémoire entier.

    dotnet-gcdump fonctionne en collectant la trace des événements émis par le récupérateur de mémoire lors d’une collecte induite de génération 2. Si le segment de mémoire est suffisamment volumineux ou s’il n’y a pas assez de mémoire pour mettre à l’échelle les mémoires tampons d’événement, les événements nécessaires à la reconstruction du graphique du segment de mémoire à partir de la trace peuvent être supprimés. Dans ce cas, pour diagnostiquer les problèmes liés au segment de mémoire, il est recommandé de collecter une image mémoire du processus.

  • dotnet-gcdump semble provoquer un problème de mémoire insuffisante dans un environnement de mémoire limitée.

    dotnet-gcdump fonctionne en collectant la trace des événements émis par le récupérateur de mémoire lors d’une collecte induite de génération 2. La mémoire tampon pour la collecte d’événements appartient à l’application cible et peut atteindre 256 Mo. dotnet-gcdump utilise également la mémoire. Si votre environnement est limité en mémoire, veillez à tenir compte de ces facteurs lors de la collecte d’un gcdump pour éviter les erreurs.