Программа для сбора и анализа дампов (dotnet-dump)

Эта статья относится к: ✔️ dotnet-dump версии 3.0.47001 и более поздних версий.

Примечание.

dotnet-dump для macOS поддерживается только в .NET 5 и более поздних версий.

Установка

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

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

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

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

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

    ОС Платформа
    Windows x86 x64 Arm-x64 Arm-x64 | | |
    Linux x64 Arm64 | | | musl-x64 musl-arm64 |

Примечание.

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

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

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

Description

Глобальное dotnet-dump средство — это способ сбора и анализа дампов в Windows, Linux и macOS без использования собственного отладчика. Это средство имеет важное значение на таких платформах, как Alpine Linux, где отсутствует полноценно работающее средство lldb. Средство dotnet-dump позволяет выполнять команды SOS для анализа сбоев и сборщика мусора (GC), но не поддерживает некоторые функции, как, например, отображение собственных кадров стека, потому что не является встроенным отладчиком.

Параметры

  • --version

    Отображение версии служебной программы dotnet-dump.

  • -h|--help

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

Команды

Command
dotnet-dump collect
dotnet-dump analyze
dotnet-dump ps

dotnet-dump collect

Записывает дамп из процесса.

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

dotnet-dump collect [-h|--help] [-p|--process-id] [-n|--name] [--type] [-o|--output] [--diag] [--crashreport]

Параметры

  • -h|--help

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

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

    Указывает идентификатор процесса, из которого нужно собрать дамп.

  • -n|--name <name>

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

  • --type <Full|Heap|Mini>

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

    • Full — самый крупный дамп, содержащий всю память, включая образы модулей.
    • Heap — большой и сравнительно подробный дамп, который содержит списки модулей, списки потоков, все стеки, сведения об исключениях, сведения об обработке и всю память, за исключением сопоставленных образов.
    • Mini — небольшой дамп, который содержит списки модулей, списки потоков, сведения об исключениях и все стеки.

    Если тип не указан, по умолчанию используется вариант Full.

  • -o|--output <output_dump_path>

    Полный путь и имя файла, в который будет записан собранный дамп. Убедитесь, что пользователь, в котором выполняется процесс dotnet, имеет разрешения на запись в указанный каталог.

    Если значение не указано, используются следующие:

    • .\dump_YYYYMMDD_HHMMSS.dmp в ОС Windows;
    • По умолчанию используется ./core_YYYYMMDD_HHMMSS в Linux и macOS.

    YYYYMMDD обозначает формат "год/месяц/день", а HHMMSS — формат "час/минута/секунда".

  • --diag

    Включает ведение журнала диагностики для сбора дампов.

  • --crashreport

    Включает создание отчета о сбоях.

Примечание.

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

Примечание.

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

dotnet-dump analyze

Запускает интерактивную оболочку для просмотра дампа. Эта оболочка принимает различные команды SOS.

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

dotnet-dump analyze <dump_path> [-h|--help] [-c|--command]

Аргументы

  • <dump_path>

    Указывает путь к анализируемому файлу дампа.

Параметры

  • -c|--command <debug_command>

    Выполняет команду при запуске. Несколько экземпляров этого параметра можно использовать в вызове к командам цепочки. Команды будут выполняться в том порядке, в который они указаны в командной строке. Если вы хотите, чтобы dotnet dump выйти после выполнения команд, последняя команда должна быть "exit".

Анализ команд SOS

Command Функция
analyzeoom Отображает сведения о последнем объекте OOM, возникшем в запросе на выделение кучи GC.
clrmodules Перечисляет управляемые модули в процессе.
clrstack Обеспечивает трассировку стека только для управляемого кода.
clrthreads Перечисляет управляемые потоки, которые выполняются.
clru Отображение дизассемблированного кода с аннотациями для управляемого метода.
d или readmemory Дамп содержимого памяти.
dbgout Включает или отключает-off внутреннее ведение журнала SOS.
dso Отображает все управляемые объекты, обнаруженные в пределах границ текущего стека.
dumpalc Отображает сведения о коллекционируемом assemblyLoadContext, в который загружается указанный объект.
dumparray Отображает сведения об управляемом массиве.
dumpasync Отображение сведений об асинхронных конечных автоматах для кучи со сборкой мусора.
dumpassembly Отображение сведений о сборке.
dumpclass Отображение сведений о структуре EEClass, находящейся по указанному адресу.
dumpconcurrentdictionary Отображает параллельное содержимое словаря.
dumpconcurrentqueue Отображает содержимое параллельной очереди.
dumpdelegate Отображение сведений о делегате.
dumpdomain Отображает сведения обо всех сборках в пределах всех доменов приложений или указанных.
dumpgcdata Отображает сведения о данных GC.
dumpgen Отображает содержимое кучи для указанного поколения.
dumpheap Отображение сведений о куче со сборкой мусора и статистики сборки мусора по объектам.
dumpil Отображает промежуточный язык Майкрософт (MSIL), связанный с управляемым методом.
dumplog Записывает в указанный файл содержимое журнала нагрузок, хранящегося в памяти.
dumpmd Отображение сведений о структуре MethodDesc, находящейся по указанному адресу.
dumpmodule Отображение сведений о модуле, находящемся по указанному адресу.
dumpmt Отображение сведений о таблице методов, расположенной по указанному адресу.
dumpobj Отображение сведений об объекте, находящемся по указанному адресу.
dumpruntimetypes Находит все объекты System.RuntimeType в куче GC и выводит имя типа и MethodTable, которые они ссылаются.
dumpsig Дамп подписи метода или поля, указанного в <sigaddr> <moduleaddr>.
dumpsigelem Дамп одного элемента объекта сигнатуры.
dumpstackobjects Отображает все управляемые объекты, обнаруженные в пределах границ текущего стека.
dumpvc Отображает сведения о полях класса значений.
eeheap Отображение сведений о памяти процессов, занятой внутренними структурами данных среды выполнения.
eestack Выполнение команды dumpstack для всех потоков в составе процесса.
eeversion Отображает сведения о версиях среды выполнения и SOS.
ehinfo Отображает блоки обработки исключений в методе JIT-ed.
exit или quit Выход из интерактивного режима.
finalizequeue Отображает все объекты, зарегистрированные для заключительной обработки.
findappdomain Пытается устранить домен приложения объекта GC.
gchandles Отображает статистику дескрипторов сборщика мусора в составе процесса.
gcheapstat Отображает статистику о сборщике мусора.
gcinfo Отображает кодировку JIT GC для метода.
gcroot Отображение сведений о ссылках (или корневых элементах) объекта, который расположен по указанному адресу.
gcwhere Отображает расположение в куче GC указанного адреса.
histclear Освобождение всех ресурсов, используемых семейством команд Hist.
histinit Инициализирует структуры SOS из журнала нагрузки, сохраненного в отлаживаемом объекте.
histobj Проверяет все записи журнала перемещения нагрузки и отображает цепочку перемещений сборки мусора, которые могли привести к адресу, переданному в качестве аргумента.
histobjfind Отображение всех записей журнала, ссылающихся на объект по указанному адресу.
histroot Отображает сведения о повышениях и перемещениях указанного корневого элемента.
histstats Отображает статистику журнала стресса.
ip2md Отображает структуру MethodDesc по указанному адресу в коде после его JIT-компиляции.
listnearobj Отображает предыдущий объект и успешное выполнение указанного адреса.
logopen Включает ведение журнала файлов консоли.
logclose Отключает ведение журнала файлов консоли.
logging Включает или отключает внутреннее ведение журнала SOS.
lm или modules Отображение выполняемых собственных модулей.
name2ee Отображение структур MethodTable и EEClass для указанного типа или метода в указанном модуле.
objsize Отображает размер указанного объекта.
parallelstacks Отображает стек объединенных потоков аналогично панели "Параллельные стеки" Visual Studio.
pathto Отображает путь к GC от <root><target>.
pe или printexception Отображает и форматирует поля всех производных объектов класса Exception, находящегося по указанному адресу.
r или registers Отображает регистры потока.
runtimes Выводит список сред выполнения в целевом объекте или изменяет среду выполнения по умолчанию.
setclrpath Задает путь для загрузки файлов dac/dbi coreclr с помощью setclrpath <path>.
setsymbolserver Включение поддержки сервера символов.
sos Выполняет различные команды отладки coreclr. Используйте синтаксис sos <command-name> <args>. Дополнительные сведения можно получить с помощью команды soshelp.
soshelp или help Отображает все доступные команды.
soshelp <command> или help <command> Отображение сведений об указанной команде.
syncblk Отображение сведений о заполнителе SyncBlock.
taskstate Отображает состояние задачи в удобочитаемом формате.
threadpool Отображает сведения о пуле потоков среды выполнения.
threadpoolqueue Отображает рабочие элементы пула потоков очереди.
threadstate Довольно печатает значение состояния потоков.
threads <threadid> или setthread <threadid> Отображение или изменение идентификатора текущего потока для команд SOS.
timerinfo Отображает сведения о выполнении таймеров.
token2ee Отображает структуру MethodTable и структуру MethodDesc для указанного токена и модуля.
traverseheap Записывает данные кучи в файл в формате, понятном профилировщиком СРЕДЫ CLR.
verifyheap Проверяет кучу GC на наличие признаков повреждения.
verifyobj Проверяет объект, передаваемый в качестве аргумента, на наличие повреждений.

Примечание.

Дополнительные сведения см. в разделе Расширение отладки SOS для .NET.

dotnet-dump ps

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

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

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

Пример

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

> dotnet-dump ps

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

С использованием dotnet-dump

Первым шагом является сборка дампа. Этот шаг можно пропустить, если уже создан основной дамп. Основные дампы могут создавать как операционная система, так и встроенная в среду выполнения .NET Core функция создания дампа.

$ dotnet-dump collect --process-id 1902
Writing minidump to file ./core_20190226_135837
Written 98983936 bytes (24166 pages) to core file
Complete

Теперь запустите анализ основного дампа с помощью команды analyze:

$ dotnet-dump analyze ./core_20190226_135850
Loading core dump: ./core_20190226_135850
Ready to process analysis commands. Type 'help' to list available commands or 'help [command]' to get detailed help on a command.
Type 'quit' or 'exit' to exit the session.
>

Это действие открывает интерактивный сеанс, который принимает команды следующего вида:

> clrstack
OS Thread Id: 0x573d (0)
    Child SP               IP Call Site
00007FFD28B42C58 00007fb22c1a8ed9 [HelperMethodFrame_PROTECTOBJ: 00007ffd28b42c58] System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean, Boolean)
00007FFD28B42DD0 00007FB1B1334F67 System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo) [/root/coreclr/src/mscorlib/src/System/Reflection/RuntimeMethodInfo.cs @ 472]
00007FFD28B42E20 00007FB1B18D33ED SymbolTestApp.Program.Foo4(System.String) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 54]
00007FFD28B42ED0 00007FB1B18D2FC4 SymbolTestApp.Program.Foo2(Int32, System.String) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 29]
00007FFD28B42F00 00007FB1B18D2F5A SymbolTestApp.Program.Foo1(Int32, System.String) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 24]
00007FFD28B42F30 00007FB1B18D168E SymbolTestApp.Program.Main(System.String[]) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 19]
00007FFD28B43210 00007fb22aa9cedf [GCFrame: 00007ffd28b43210]
00007FFD28B43610 00007fb22aa9cedf [GCFrame: 00007ffd28b43610]

Чтобы получить сведения о необработанном исключении, которое привело к сбою приложения, выполните:

> pe -lines
Exception object: 00007fb18c038590
Exception type:   System.Reflection.TargetInvocationException
Message:          Exception has been thrown by the target of an invocation.
InnerException:   System.Exception, Use !PrintException 00007FB18C038368 to see more.
StackTrace (generated):
SP               IP               Function
00007FFD28B42DD0 0000000000000000 System.Private.CoreLib.dll!System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean, Boolean)
00007FFD28B42DD0 00007FB1B1334F67 System.Private.CoreLib.dll!System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo)+0xa7 [/root/coreclr/src/mscorlib/src/System/Reflection/RuntimeMethodInfo.cs @ 472]
00007FFD28B42E20 00007FB1B18D33ED SymbolTestApp.dll!SymbolTestApp.Program.Foo4(System.String)+0x15d [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 54]
00007FFD28B42ED0 00007FB1B18D2FC4 SymbolTestApp.dll!SymbolTestApp.Program.Foo2(Int32, System.String)+0x34 [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 29]
00007FFD28B42F00 00007FB1B18D2F5A SymbolTestApp.dll!SymbolTestApp.Program.Foo1(Int32, System.String)+0x3a [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 24]
00007FFD28B42F30 00007FB1B18D168E SymbolTestApp.dll!SymbolTestApp.Program.Main(System.String[])+0x6e [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 19]

StackTraceString: <none>
HResult: 80131604

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

Сбор дампов требует, чтобы процесс мог вызываться ptrace. При возникновении проблем с сбором дампов может быть настроена среда, на которой вы работаете, для ограничения таких вызовов. Ознакомьтесь с нашими дампами: часто задаваемые вопросы об устранении неполадок и возможных решениях распространенных проблем.

См. также