Служебная программа отладки динамического процесса и дампа (dotnet-debug)

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

Замечание

dotnet-debug В настоящее время поддерживается только приложения на основе CoreCLR и в настоящее время не поддерживается в macOS.

Install

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

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

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

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

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

    OS Platform
    Виндоус x86 x64 Arm-x64 Arm-x64 |
    Линукс x64 Arm64 | | musl-x64 musl-arm64 |

Synopsis

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

Description

Глобальное dotnet-debug средство позволяет подключаться к динамическим процессам .NET и анализировать файлы дампа в интерактивном режиме. В отличие dotnet-dumpот того, что основное внимание уделяется сбору дампов и автономному анализу, dotnet-debug предназначено для динамической проверки процессов. Она поддерживает все те же команды отладки SOS , что и dotnet-dumpкоманды.

Это средство полезно на таких платформах, как Alpine Linux, где полностью lldb недоступен. Средство dotnet-debug запускает команды SOS для анализа управляемого состояния и диагностики кучи, но это не собственный отладчик, поэтому отображение собственных кадров стека не поддерживается.

Options

  • --version

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

  • -h|--help

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

Commands

Command
подключение dotnet-debug
dotnet-debug open-dump

подключение dotnet-debug

Присоединяется к динамическому процессу и запускает интерактивную оболочку с командами отладки для изучения.

Synopsis

dotnet-debug attach <process-id> [-c|--commands <debug_command>] [--accept-license-agreement]

Arguments

  • <process-id>

    Идентификатор процесса для присоединения к нему и анализа.

Options

  • -c|--commands <debug_command>

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

  • --accept-license-agreement

    Принимает соглашение о лицензировании без запроса.

Example

Присоединение к работающему процессу с идентификатором 1234:

$ dotnet-debug attach 1234
Attaching to process: 1234 ...
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.
>

Выполните команду при подключении и выходе:

dotnet-debug attach 1234 -c clrstack -c exit

dotnet-debug open-dump

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

Synopsis

dotnet-debug open-dump <dump_path> [-c|--commands] [--accept-license-agreement]

Arguments

  • <dump_path>

    Путь к файлу дампа для анализа.

Options

  • -c|--commands <debug_command>

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

  • --accept-license-agreement

    Принимает соглашение о лицензировании без запроса.

Example

Откройте и проанализируйте файл дампа:

$ dotnet-debug open-dump ./core_20260209_135837
Loading dump: ./core_20260209_135837 ...
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.
>

Отладка команд SOS

Обе attachopen-dump команды содержат интерактивный сеанс, принимаюющий следующие команды 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 Отображает общий промежуточный язык (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-debug для присоединения к динамическому процессу

В следующем примере показано, как подключиться к работающему процессу .NET и исследовать проблему пула потоков:

$ dotnet-debug attach 1902
Attaching to process: 1902 ...
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)
00007FFD28B42E20 00007FB1B18D33ED SymbolTestApp.Program.Foo4(System.String)
00007FFD28B42ED0 00007FB1B18D2FC4 SymbolTestApp.Program.Foo2(Int32, System.String)
00007FFD28B42F00 00007FB1B18D2F5A SymbolTestApp.Program.Foo1(Int32, System.String)
00007FFD28B42F30 00007FB1B18D168E SymbolTestApp.Program.Main(System.String[])

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

> 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
00007FFD28B42E20 00007FB1B18D33ED SymbolTestApp.dll!SymbolTestApp.Program.Foo4(System.String)+0x15d

StackTraceString: <none>
HResult: 80131604

dotnet-debug и dotnet-dump

dotnet-debug и dotnet-dump совместно использовать те же команды отладки SOS, но служат различным основным целям:

Функция dotnet-debug dotnet-dump
Присоединение к динамическому процессу ✔️
Сбор дампов ✔️
Анализ файлов дампа ✔️ ✔️
Перечисление процессов .NET (ps) ✔️

Используйте dotnet-debug при необходимости интерактивной отладки динамического процесса. Используйте dotnet-dump , когда необходимо собирать дампы или анализировать их в автономном режиме.

См. также