Поделиться через


Средство анализа кучи (dotnet-gcdump)

Эта статья относится к: ✔️ dotnet-gcdump версии 10.0 и более поздним версиям

Установка

Есть два способа загрузки и установки dotnet-gcdump:

  • Средство dotnet global:

    Чтобы установить последнюю версию dotnet-gcdump, используйте команду dotnet tool install.

    dotnet tool install --global dotnet-gcdump
    
  • Прямое скачивание:

    скачайте исполняемый файл средства, соответствующий вашей платформе:

    ОС Платформа
    Виндоус
    Линукс x64 Arm64 | | musl-x64 musl-arm64 |

Примечание.

Для использования dotnet-gcdump в приложении x86 необходима соответствующая версия средства для архитектуры x86.

Краткие сведения

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

Описание

Глобальное средство dotnet-gcdump собирает дампы сборщика мусора для активных процессов .NET с помощью EventPipe. Дампы сборщика мусора создаются путем его запуска в целевом процессе, включения специальных событий и повторного создания графа корней объектов из потока событий. Этот процесс позволяет собирать дампы сборщика мусора во время выполнения процесса и с минимальными издержками. Эти дампы могут быть полезны в нескольких сценариях.

  • Сравнение количества объектов в куче в нескольких моментах времени.
  • Анализ корней объектов (ответы на вопросы вида "что все еще содержит ссылку на этот тип?").
  • Сбор общей статистики о количестве объектов в куче.

Просмотр дампа сборщика мусора, захваченного с помощью dotnet-gcdump

В Windows файлы .gcdump можно просмотреть в PerfView для анализа или в Visual Studio. В настоящее время нет способа открытия .gcdump на платформах, отличных от Windows.

Вы можете объединить несколько файлов .gcdump и открыть их одновременно в Visual Studio, чтобы получить возможность сравнения.

Параметры

  • --version

    Отображает версию программы dotnet-gcdump.

  • -h|--help

    Отображение справки в командной строке.

Команды

Команда
dotnet-gcdump collect
dotnet-gcdump ps
Отчет dotnet-gcdump

dotnet-gcdump collect

Собирает дамп сборщика мусора из выполняемого в данный момент процесса.

Предупреждение

Чтобы проанализировать кучу сборки мусора, эта команда запускает сборку мусора поколения 2 (полная), которая может временно приостановить выполнение среды выполнения, особенно если куча велика. Не используйте эту команду в средах, где это может повлиять на производительность, если куча сборки мусора велика.

Краткие сведения

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

Параметры

  • -h|--help

    Отображение справки в командной строке.

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

    Идентификатор процесса, из которого нужно получить дамп сборщика мусора.

    Примечание.

    В Linux и macOS для использования этого параметра требуется целевое приложение и совместно использовать одну и dotnet-gcdump ту же TMPDIR переменную среды. В противном случае время ожидания команды истечет.

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

    Путь, по которому нужно записывать собранные дампы сборщика мусора. По умолчанию используется значение .\YYYYMMDD_HHMMSS_<pid.gcdump>.

  • -v|--verbose

    Выводить журнал во время сбора дампа сборщика мусора.

  • -t|--timeout <timeout>

    Прервать сбор дампа сборщика мусора, если он занимает больше указанного количества секунд. Значение по умолчанию — 30.

  • -n|--name <name>

    Имя процесса, из которого нужно получить дамп сборщика мусора.

    Примечание.

    В Linux и macOS для использования этого параметра требуется целевое приложение и совместно использовать одну и dotnet-gcdump ту же TMPDIR переменную среды. В противном случае время ожидания команды истечет.

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

    Задает порт диагностики , используемый для обмена данными с процессом, который необходимо дампать. dotnet-gcdump и среда выполнения .NET внутри целевого процесса должны согласиться с адресом порта, с одним прослушивания и другим подключением. dotnet-gcdump автоматически определяет правильный порт при подключении с помощью --process-id параметров или --name параметров. Обычно необходимо явно указать порт при взаимодействии с процессом, выполняющимся внутри контейнера, который не является частью текущего пространства имен процесса.

    Отличается port-address по ОС:

    • Linux и macOS — путь к сокету домена Unix, например /foo/tool1.socket.
    • Windows — путь к именованной трубе, например \\.\pipe\my_diag_port1.
    • Android, iOS и tvOS — ip:port, например 127.0.0.1:9000.

    По умолчанию dotnet-gcdump прослушивает указанный адрес. Вместо этого можно запросить dotnet-gcdump для подключения, добавив ,connect после адреса. Например, --diagnostic-port /foo/tool1.socket,connect подключитесь к процессу выполнения .NET, который прослушивает /foo/tool1.socket сокет домена Unix.

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

    Запускает dotnet-dsrouter и подключается к нему. Требуется установить dotnet-dsrouter . Запустите dotnet-dsrouter -h для получения дополнительных сведений.

Примечание.

Чтобы собрать дамп сборки мусора с помощью dotnet-gcdump, ее необходимо запустить от имени пользователя, запустившего целевой процесс, или от имени привилегированного пользователя. В противном случае средство не сможет установить соединение с целевым процессом.

dotnet-gcdump ps

Список процессов dotnet, из которых можно получить дамп сборщика мусора. dotnet-gcdump 6.0.320703 и более поздних версий, также отображаются аргументы командной строки, с которыми был запущен каждый процесс при наличии.

Краткие сведения

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

Пример

Предположим, что вы запускаете длинное приложение с помощью команды dotnet run --configuration Release. В другом окне выполните dotnet-gcdump ps команду. Выходные данные, которые вы увидите, приведены ниже. Аргументы командной строки, если таковые имеются, отображаются с помощью dotnet-gcdump версии 6.0.320703 и более поздних версий.

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

Создание отчета из ранее созданного дампа сборщика мусора или из выполняющегося процесса и запись его в stdout.

Краткие сведения

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

Параметры

  • -h|--help

    Отображение справки в командной строке.

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

    Идентификатор процесса, из которого нужно получить дамп сборщика мусора.

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

    Тип создаваемого отчета. Доступные значения: heapstat (по умолчанию).

Устранение неполадок

  • В gcdump нет сведений о типе.

    До .NET Core 3.1 существовала проблема, при которой кэш типов не очищался между вызовами gcdump, когда они вызывались с помощью EventPipe. Это приводило к тому, что события, необходимые для определения сведений о типе, не отправлялись для второго и последующего вызовов gcdump. Это было исправлено в версии .NET Core 3.1-preview2.

  • COM и статические типы не содержатся в дампе сборщика мусора.

    До .NET Core 3.1 возникла проблема, из-за которой статические и COM-типы не отправлялись при вызове дампа GC через EventPipe. Это исправлено в .NET Core 3.1.

  • dotnet-gcdumpНе удается создать .gcdump файл из-за отсутствия сведений, например [Error] Exception во время gcdump: System.ApplicationException: ETL-файл показывает начало дампа кучи, но не его завершение. .gcdump Или файл не включает всю кучу.

    dotnet-gcdump выполняется путем сбора трассировки событий, создаваемых сборщиком мусора во время индуцированной коллекции поколения 2. Если куча достаточно велика или недостаточно памяти для масштабирования буферов событий, события, необходимые для восстановления графа кучи из трассировки, могут быть удалены. В этом случае для диагностики проблем с кучей рекомендуется собрать дамп процесса.

  • dotnet-gcdump Возникает проблема с нехваткой памяти в ограниченной среде памяти.

    dotnet-gcdump выполняется путем сбора трассировки событий, создаваемых сборщиком мусора во время индуцированной коллекции поколения 2. Буфер коллекции событий принадлежит целевому приложению и может увеличиться до 256 МБ. dotnet-gcdump сама по себе также использует память. Если среда ограничена памятью, обязательно учитывайте эти факторы при сборе gcdump, чтобы предотвратить ошибки.