Sdílet prostřednictvím


Nástroj pro analýzu haldy (dotnet-gcdump)

Tento článek se vztahuje na: ✔️ dotnet-gcdump verze 10.0 a novější verze

Instalace

Existují dva způsoby, jak stáhnout a nainstalovat dotnet-gcdump:

Poznámka:

Pokud chcete použít dotnet-gcdump v aplikaci x86, potřebujete odpovídající verzi nástroje x86.

Synopse

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

Popis

Globální dotnet-gcdump nástroj shromažďuje výpisy paměti GC (Garbage Collector) živých procesů .NET pomocí eventPipe. Výpisy paměti GC se vytvářejí aktivací GC v cílovém procesu, zapnutím zvláštních událostí a opětovném vygenerováním grafu kořenových objektů z datového proudu událostí. Tento proces umožňuje shromažďování výpisů paměti paměti, když je proces spuštěný a s minimální režií. Tyto výpisy paměti jsou užitečné pro několik scénářů:

  • Porovnání počtu objektů v haldě v několika bodech v čase.
  • Analýza kořenů objektů (odpovídání na otázky typu "co stále obsahuje odkaz na tento typ?").
  • Shromažďování obecných statistik o počtech objektů v haldě.

Zobrazení výpisu paměti GC zachyceného z dotnet-gcdump

Ve Windows .gcdump lze soubory zobrazit v nástroji PerfView pro analýzu nebo v sadě Visual Studio. V současné době neexistuje způsob, jak otevřít na .gcdump platformách jiných než Windows.

Můžete shromáždit více .gcdumps a otevřít je současně v sadě Visual Studio, abyste získali možnosti porovnání.

Možnosti

  • --version

    Zobrazí verzi dotnet-gcdump nástroje.

  • -h|--help

    Zobrazuje nápovědu k příkazovému řádku.

Příkazy

Příkaz
dotnet-gcdump collect
dotnet-gcdump ps
dotnet-gcdump report

dotnet-gcdump collect

Shromažďuje výpis paměti paměti z aktuálně spuštěného procesu.

Upozorňující

Pokud chcete projít haldu uvolňování paměti GC, tento příkaz aktivuje uvolňování paměti generace 2 (úplné), což může pozastavit modul runtime po dlouhou dobu, zejména v případě, že halda uvolňování paměti je velká. Tento příkaz nepoužívejte v prostředích citlivých na výkon, pokud je halda GC velká.

Synopse

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

Možnosti

  • -h|--help

    Zobrazuje nápovědu k příkazovému řádku.

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

    ID procesu pro shromáždění výpisu paměti paměti z.

    Poznámka:

    V Linuxu a macOS vyžaduje použití této možnosti cílovou aplikaci a dotnet-gcdump sdílení stejné TMPDIR proměnné prostředí. Jinak vyprší časový limit příkazu.

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

    Cesta, kam se mají zapisovat shromážděné výpisy paměti paměti. Výchozí hodnota je .\YYYYMMDD_HHMMSS_<pid.gcdump>.

  • -v|--verbose

    Vypíše protokol při shromažďování výpisu paměti paměti.

  • -t|--timeout <timeout>

    Vzdát se shromažďování výpisu paměti GC, pokud trvá déle než tento počet sekund. Výchozí hodnota je 30.

  • -n|--name <name>

    Název procesu pro shromáždění výpisu paměti paměti z.

    Poznámka:

    V Linuxu a macOS vyžaduje použití této možnosti cílovou aplikaci a dotnet-gcdump sdílení stejné TMPDIR proměnné prostředí. Jinak vyprší časový limit příkazu.

  • --diagnostic-port <port-address[,(listen|connect)]>

    Nastaví diagnostický port použitý ke komunikaci s procesem, který se má vyhodit. dotnet-gcdump a modul runtime .NET uvnitř cílového procesu musí souhlasit s adresou portu s jedním nasloucháním a druhým připojením. dotnet-gcdump automaticky určuje správný port při připojování pomocí --process-id možností.--name Při komunikaci s procesem spuštěným v kontejneru, který není součástí oboru názvů aktuálního procesu, je obvykle nutné zadat port explicitně.

    Liší se port-address podle operačního systému:

    • Linux a macOS – cesta k soketu domény Unixu, například /foo/tool1.socket.
    • Windows – cesta k pojmenované svislé sadě, například \\.\pipe\my_diag_port1.
    • Android, iOS a tvOS – IP:port, například 127.0.0.1:9000.

    Ve výchozím nastavení dotnet-gcdump naslouchá na zadané adrese. Místo toho můžete požádat o připojení dotnet-gcdump připojením ,connect za adresu. Připojí se například --diagnostic-port /foo/tool1.socket,connect k procesu modulu runtime .NET, který naslouchá soketu domény unixu /foo/tool1.socket .

  • --dsrouter {ios|ios-sim|android|android|android-emu}

    Spustí dotnet-dsrouter a připojí se k němu. Vyžaduje instalaci dotnet-dsrouter . Další informace potřebujete spustit dotnet-dsrouter -h .

Poznámka:

Chcete-li shromáždit výpis paměti paměti pomocí dotnet-gcdump, musí být spuštěn jako stejný uživatel jako uživatel, který spouští cílový proces nebo jako kořen. Jinak se nástroj nepodaří navázat spojení s cílovým procesem.

dotnet-gcdump ps

Zobrazí seznam procesů dotnet, pro které lze shromažďovat výpisy paměti paměti. dotnet-gcdump 6.0.320703 a novější zobrazte také argumenty příkazového řádku, se kterými byly jednotlivé procesy spuštěny, pokud jsou k dispozici.

Synopse

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

Příklad

Předpokládejme, že spustíte dlouhotrvající aplikaci pomocí příkazu dotnet run --configuration Release. V jiném okně spustíte dotnet-gcdump ps příkaz. Výstup, který uvidíte, je následující. Pokud existují argumenty příkazového řádku, zobrazí se ve dotnet-gcdump verzi 6.0.320703 a novější.

> 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>

Vygenerujte sestavu z dříve generovaného výpisu paměti GC nebo ze spuštěného procesu a zapište do stdoutsouboru .

Synopse

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

Možnosti

  • -h|--help

    Zobrazuje nápovědu k příkazovému řádku.

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

    ID procesu pro shromáždění výpisu paměti paměti z.

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

    Typ sestavy, kterou chcete vygenerovat. Dostupné možnosti: haldy (výchozí).

Odstraňování potíží

  • V souboru gcdump nejsou žádné informace o typu.

    Před .NET Core 3.1 došlo k problému, kdy se při vyvolání pomocí eventPipe nevymazala mezipaměť typu mezi gcdumps. Výsledkem byly události potřebné k určení informací o typu, které se neodesílají za sekundu a následné gcdumps. Tato oprava byla opravena v .NET Core 3.1-Preview2.

  • Com a statické typy nejsou v výpisu paměti GC.

    Před .NET Core 3.1 došlo k problému, kdy se statické typy a typy MODELU COM neodesílaly při vyvolání výpisu paměti paměti přes EventPipe. Tato oprava byla opravena v .NET Core 3.1.

  • dotnet-gcdumpkvůli chybějícím informacím .gcdump nelze vygenerovat soubor, například [Chyba] Výjimka během gcdump: System.ApplicationException: Soubor ETL zobrazuje začátek výpisu haldy, ale ne jeho dokončení. .gcdump Nebo soubor neobsahuje celou haldu.

    dotnet-gcdump funguje tak, že shromažďuje trasování událostí vygenerovaných uvolňováním paměti během indukované kolekce generace 2. Pokud je halda dostatečně velká nebo není dostatek paměti pro škálování vyrovnávacích pamětí událostí, můžou se vynechat události potřebné k rekonstrukci grafu haldy z trasování. V takovém případě se doporučuje kvůli diagnostice problémů s haldou shromáždit výpis stavu procesu.

  • dotnet-gcdump zdá se způsobit problém s nedostatkem paměti v omezeném prostředí paměti.

    dotnet-gcdump funguje tak, že shromažďuje trasování událostí vygenerovaných uvolňováním paměti během indukované kolekce generace 2. Cílová aplikace vlastní vyrovnávací paměť pro kolekci událostí a může růst až 256 MB. dotnet-gcdump také používá paměť. Pokud je vaše prostředí omezené na paměť, nezapomeňte při shromažďování souboru gcdump zohlednit tyto faktory, aby se zabránilo chybám.