Программа для сбора и анализа дампов (dotnet-dump)
Эта статья относится к: ✔️ dotnet-dump
версии 3.0.47001 и более поздних версий.
Примечание.
dotnet-dump
для macOS поддерживается только в .NET 5 и более поздних версий.
Установка
Есть два способа загрузки и установки dotnet-dump
:
Средство dotnet global:
Чтобы установить последнюю версию пакета NuGet
dotnet-dump
, используйте команду 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
Отображение справки в командной строке.
Команды
Команда |
---|
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
Команда | Function |
---|---|
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 |
Отображает общий промежуточный язык (CIL), связанный с управляемым методом. |
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
. При возникновении проблем с сбором дампов может быть настроена среда, на которой вы работаете, для ограничения таких вызовов. Ознакомьтесь с нашими дампами: часто задаваемые вопросы об устранении неполадок и возможных решениях распространенных проблем.