Расширение отладки SOS

Расширение отладки SOS позволяет просматривать сведения о коде, выполняемом в среде выполнения .NET Core, для активных процессов и дампов. Это расширение предустанавливается с помощью dotnet-dump и Windbg/dbg. Также его можно скачать для использования с LLDB. Расширение отладки SOS можно использовать для следующих способов:

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

Синтаксис

Windows

![command] [options]

Linux и macOS

sos [command] [options]

У многих команд в lldb есть псевдонимы или ярлыки:

clrstack [options]

Команды

Следующую таблицу команд можно также просмотреть в разделе Справка или с помощью команды soshelp. Справку по отдельным командам можно просмотреть с помощью команды soshelp <command>.

Get-Help Описание
bpmd [-nofuturemodule] [<имя> метода имени>< модуля] [-md<MethodDesc>] -list-clear<pending breakpointnumber-clearall> Создает точку останова в указанном методе указанного модуля.

Если указанные модуль и метод не загружены, команда ожидает уведомления о загрузке модуля и выполнении JIT-компиляции, прежде чем создавать точку останова.

Списком ожидающих точек останова можно управлять с помощью параметров -list, -clear и -clearall.

Параметр -list создает список всех ожидающих точек останова. Если ожидающая точка останова имеет идентификатор модуля, отличный от нуля, эта точка останова связана с функцией в конкретном загруженном модуле. Если ожидающая точка останова имеет нулевой идентификатор модуля, такая точка останова применяется к еще не загруженным модулям.

Чтобы удалить из списка ожидающие точки останова, следует использовать параметр -clear или -clearall.
CLRStack [ -a] [ -l] [ -p] [ -n] [ -f] [ -r] [ -all] Обеспечивает трассировку стека только для управляемого кода.

Параметр -p задает отображение аргументов управляемой функции.

Параметр -l задает отображение сведений о локальных переменных в кадре. Расширение отладки SOS не может получить локальные имена, поэтому выходные данные для локальных имен имеют формат <значения>локального адреса>=<.

Параметр -a заменяет собой комбинацию параметров -l и -p.

Параметр -n отключает отображение имен исходных файлов и номеров строк. Если для отладчика указан параметр "SYMOPT_LOAD_LINES", расширение отладки SOS ищет символы для каждого управляемого кадра и в случае успеха отображает соответствующее имя исходного файла и номер строки. Такое поведение можно отключить, задав параметр -n (без номеров строк).

Параметр -f (полный режим) отображает кадры машинного кода, в которых используются управляемые кадры, а также имя сборки и смещение функции для управляемых кадров. Этот параметр не отображает машинные кадры при использовании совместно с dotnet-dump.

Параметр -r создает дампы регистров для каждого кадра стека.

Параметр -all создает дампы для стеков всех управляемых потоков.
COMState Выдает список моделей контейнера COM для каждого потока и указатель Context, если он имеется. Эта команда поддерживается только в Windows.
DumpArray [-start<startIndex>] [-length<length>] [-details] [-nofields] <адрес объекта массива>

-или-

DA [-start<startIndex>] [длина длины<>] [-details] [-nofields] адрес объекта массива>
Анализирует элементы объекта массива.

Параметр -start задает индекс, начиная с которого отображаются элементы.

Параметр -length задает количество отображаемых элементов.

Параметр -details задает отображение сведений об элементе в формате DumpObj и DumpVC.

Параметр -nofields отменяет отображение массивов. Этот параметр доступен, только если указан параметр -details .
DumpAsync (dumpasync) [-mt<MethodTable address>] [-type<partial type name>] [-waiting] [-root] DumpAsync просматривает собранную кучу мусора и ищет объекты, представляющие компьютеры асинхронного состояния, созданные при передаче состояния асинхронного метода в кучу. Эта команда распознает асинхронные конечные автоматы, определяемые как async void, async Task, async Task<T>, async ValueTask и async ValueTask<T>.

В выходных данных содержится блок сведений для каждого найденного объекта асинхронного конечного автомата. Они могут включать:
— строка для типа объекта асинхронного конечного автомата, включая его адрес MethodTable, адрес объекта, размер и имя типа.
— строка для имени типа конечного автомата, содержащегося в объекте .
— список каждого поля на конечном автомате.
— строка для продолжения из этого объекта конечного автомата, если зарегистрировано одно или несколько.
— обнаружены корни сборки мусора для этого объекта асинхронного конечного автомата.
DumpAssembly<адрес сборки> Отображает сведения о сборке.

Команда DumpAssembly выводит список модулей, если они существуют.

Адрес сборки можно получить с помощью команды DumpDomain.
DumpClass<Адрес EEClass> Отображает сведения о структуре EEClass, связанной с типом.

Команда DumpClass отображает значения статических полей, но значения нестатических полей не отображаются.

Используйте команду DumpMT, DumpObj, Name2EE или Token2EE, чтобы получить адрес структуры EEClass.
DumpDomain [<адрес> домена] Перечисляет все объекты Assembly, загруженные по указанному адресу объекта AppDomain. При вызове без параметров команда DumpDomain выводит список всех объектов AppDomain в составе процесса. Поскольку в .NET Core есть только один объект AppDomain, команда DumpDomain возвращает только один объект.
DumpHeap [-stat] [-strings] [-short] [-min<size>] [-max<size>] [-thinlock] [-startAtLowerBound] [-mt<MethodTable address>] [-type<partial type name>] [start [end]] Отображает сведения о куче со сборкой мусора и статистику сбора мусора по объектам.

В случае чрезмерной фрагментации кучи сборщика мусора команда DumpHeap выдает соответствующее предупреждение.

Параметр -stat ограничивает выводимую информацию статистической сводкой по типам.

Параметр -strings ограничивает выводимую информацию статистической сводкой по значениям строк.

Параметр -short ограничивает вывод только адресом каждого объекта. Благодаря такому подходу можно легко передавать результат из одной команды отладчика в другую команду с целью автоматизации.

Параметр -min задает пропуск объектов, размер которых меньше значения параметра size, указанного в байтах.

Параметр -max задает пропуск объектов, размер которых больше значения параметра size, указанного в байтах.

Параметр -thinlock сообщает о блокировках ThinLock. Дополнительные сведения см. в описании команды SyncBlk.

Параметр -startAtLowerBound приводит к тому, что обход кучи начинается с нижней границы предоставленного диапазона адресов. На стадии планирования куча часто является неанализируемой, поскольку объекты перемещаются. Этот параметр заставляет DumpHeap начать проверку с указанной нижней границы. Чтобы задействовать этот параметр, необходимо указать адрес допустимого объекта в качестве нижней границы. Можно отобразить память по адресу неверного объекта, чтобы вручную найти следующую таблицу методов. Если сборка мусора выполняется в момент вызова memcopy, также можно найти адрес следующего объекта путем добавления размера к начальному адресу, который указан как параметр.

Параметр -mt задает вывод только тех объектов, которые соответствуют указанной структуре MethodTable.

Параметр -type задает вывод только тех объектов, имя типа которых содержит указанную строку.

Параметр start задает составление списка, начиная с указанного адреса.

Параметр end прекращает составление списка на указанном адресе.
DumpIL<Управляемый объект> DynamicMethod | < Указатель >DynamicMethodDesc | <Указатель MethodDesc> Отображает язык CIL, связанный с управляемым методом.

Динамический язык MSIL генерируется иначе, чем язык MSIL, загруженный из сборки. Динамический язык CIL ссылается на объекты в массиве управляемых объектов, а не на токены метаданных.
DumpLog [-addr<addressOfStressLog>] [<Имя файла>] Записывает в указанный файл содержимое журнала нагрузок, хранящегося в памяти. Если имя не указано, команда создает файл "StressLog.txt" в текущем каталоге.

Хранящийся в памяти журнал нагрузок помогает при диагностике сбоев, вызываемых нагрузкой, без использования блокировки или ввода-вывода. Чтобы разрешить ведение журнала нагрузок, задайте следующие значения в разделе HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework.

(DWORD) StressLog = 1

(DWORD) LogFacility = 0xffffffff

(DWORD) StressLogSize = 65536

С помощью необязательного параметра -addr можно указать журнал нагрузки, отличный от журнала по умолчанию.
DumpMD<Адрес MethodDesc> Отображает сведения о структуре MethodDesc, находящейся по указанному адресу.

Чтобы получить адрес структуры MethodDesc из управляемой функции, можно использовать команду IP2MD.
DumpMT [-MD] <адрес MethodTable> Отображает сведения о таблице методов, расположенной по указанному адресу. Параметр -MD задает вывод списка всех методов, определенных вместе с объектом.

Каждый управляемый объект содержит указатель на таблицу методов.
DumpModule [-mt] <адрес модуля> Отображает информацию о модуле, находящемся по указанному адресу. Параметр -mt задает отображение типов, определенных в модуле, и типов, на которые имеются ссылки в модуле

Чтобы получить адрес модуля, можно использовать команду DumpDomain или DumpAssembly.
DumpObj [-nofields] <адрес объекта>

-или-

DO<адрес объекта>
Отображает сведения об объекте, находящемся по указанному адресу. Команда DumpObj отображает список полей, сведения о структуре EEClass, таблицу методов и размер объекта.

Чтобы получить адрес объекта, можно использовать команду DumpStackObjects.

Команду DumpObj можно выполнять для полей типа CLASS, поскольку они также являются объектами.

Параметр -nofields не предотвращает отображение полей объекта, что удобно для таких объектов, как String.
DumpRuntimeTypes Отображает объекты типы среды выполнения в куче сборщика мусора и выводит список связанных с ними имен типов и таблиц методов.
DumpStack [-EE] [-n] [topстек [bottomстек]] Отображает трассировку стека.

Параметр -EE команды DumpStack задает отображение только управляемых функций. Параметры top и bottom позволяют ограничить состав отображаемых кадров стека на платформах x86.

Параметр -n отключает отображение имен исходных файлов и номеров строк. Если для отладчика указан параметр "SYMOPT_LOAD_LINES", расширение отладки SOS ищет символы для каждого управляемого кадра и в случае успеха отображает соответствующее имя исходного файла и номер строки. Такое поведение можно отключить, задав параметр -n (без номеров строк).

DumpSig<sigaddr><moduleaddr> Отображает сведения о структуре Sig, находящейся по указанному адресу.
DumpSigelem<sigaddr><moduleaddr> Отображает единственный элемент объекта сигнатуры. В большинстве случаев следует использовать DumpSig для просмотра отдельных объектов сигнатур. Тем не менее, если сигнатура каким-либо образом повреждена, можно использовать DumpSigElem для чтения ее допустимых частей.
DumpStackObjects [-verify] [topstack [bottomstack]]

-или-

DSO [-verify] [topстек [bottomстек]]
Отображает все управляемые объекты, обнаруженные в пределах границ текущего стека.

Параметр -verify задает проверку каждого нестатического поля CLASS в поле объекта.

Для определения значений локальных переменных и параметров используйте команду DumpStackObject вместе с командами трассировки стека, такими как K (windbg) или bt (lldb) и clrstack.
DumpVC< Адрес ><MethodTableАдрес> Отображает сведения о полях класса значений, находящегося по указанному адресу.

Параметр MethodTable позволяет команде DumpVC правильно интерпретировать поля. В классах значений первое поле не содержит таблицу методов.
EEHeap [ -gc] [ -loader] Отображение сведений о памяти процесса, занимаемой внутренними структурами данных среды выполнения.

Параметры -gc и -loader ограничивают выходные данные этой команды только сведениями о структурах данных сборщика мусора и загрузчика.

Сведения о сборщике мусора включает в себя диапазоны каждого сегмента в управляемой куче. Если указатель попадает в диапазон сегмента, заданный параметром -gc, значит, он является указателем объекта.
EEStack [ -short] [ -EE] Выполняет команду DumpStack для всех потоков в составе процесса.

Параметр -EE передается непосредственно в команду DumpStack. Параметр -short ограничивает выходные данные следующими видами потоков.

Потоки с блокировкой.

Потоки, остановленные для сбора мусора.

Потоки, которые в данный момент находятся в управляемом коде.
EHInfo [<Адрес >метода] [<адрес> кода] Отображает блоки обработки исключений в указанном методе. Данная команда выводит адреса кода и смещения для блока предложений (блока try) и блока обработчика (блока catch).
FAQ Отображает вопросы и ответы. Не поддерживается в dotnet-dump.
FinalizeQueue [-detail] | [-allReady] [-short] Отображает все объекты, зарегистрированные для заключительной обработки.

Параметр -detail задает вывод дополнительной информации обо всех блоках SyncBlocks, которые необходимо очистить, и оболочках RuntimeCallableWrappers, ожидающих очистки. Поток завершения кэширует и очищает обе эти структуры данных.

Параметр -allReady отображает все объекты, которые уже готовы к завершению без учета того, помечены они для сборки мусора или будут помечены следующей сборкой мусора. Объекты, отсутствующие в списке "готовые для завершения", — это завершаемые объекты, которые больше не являются корневым. Применение этого параметра может быть очень затратным, поскольку проверяется, все ли объекты в завершаемых очередях по-прежнему являются корневыми.

Параметр -short ограничивает вывод адресом каждого объекта. При использовании в сочетании с -allReady он перечисляет все объекты с методом завершения, которые больше не являются корневыми. При независимом использовании создает список всех объектов в очередях "поддерживающие завершение" и "готовые для завершения".
FindAppDomain<Адрес объекта> Определяет домен приложения для объекта, находящегося по указанному адресу.
FindRoots-gen<N> | -gen any |<адрес объекта> Вызывает остановку отладчика в отлаживаемом объекте следующей коллекции заданного поколения. Эффект сбрасывается, как только произойдет останов. Чтобы остановиться на следующей коллекции, необходимо повторное выполнение команды. Форма <адреса> объекта этой команды используется после прерывания, вызванного -gen или -gen any. В этот момент отлаживаемый объект находится в правильном состоянии для FindRoots для идентификации корневых элементов для объектов из поколений, уничтожаемых в данный момент. Поддерживается только в Windows.
GCHandles [ -perdomain] Отображает статистику дескрипторов сборщика мусора в составе процесса.

Параметр -perdomain упорядочивает статистику по доменам приложений.

Команда GCHandles служит для поиска утечек памяти, вызываемых утечками дескрипторов сборщика мусора. Например, утечка памяти происходит, когда в коде продолжает использоваться большой массив, поскольку на него еще указывает строгий дескриптор сборщика мусора, а сам дескриптор удаляется без освобождения памяти.

Поддерживается только в Windows.
GCHandleLeaks Ищет в памяти ссылки на строгие и закрепленные дескрипторы сборщика мусора в рамках процесса и отображает результаты. При обнаружении дескриптора команда GCHandleLeaks отображает адрес ссылки. Если дескриптор в памяти не найден, выдается уведомление. Поддерживается только в Windows.
GCInfo< Адрес ><MethodDescАдрес кода> Отображает данные, показывающие, содержатся ли управляемые объекты в регистрах или ячейках стека. Если производится сбор мусора, сборщик должен знать расположение ссылок на объекты, чтобы их можно было обновить новыми значениями указателей объектов.
GCRoot [-nostacks] [-all] <Адрес объекта> Отображает информацию о ссылках (или корневых элементах) объекта, находящегося по указанному адресу.

Команда GCRoot анализирует всю управляемую кучу и таблицу дескрипторов в поисках дескрипторов, находящихся в других объектах или в стеке. Затем каждый стек просматривается в поисках указателей на объекты; также просматривается и очередь метода завершения.

Данная команда не определяет, является ли корень стека допустимым или удален ли он. Используйте команды clrstack и U, чтобы дизассемблировать кадр, к которому принадлежит локальное значение или значение аргумента, и определить, используется ли еще корень стека.

Параметр -nostacks ограничивает поиск дескрипторами сборщика мусора и достижимыми объектами.

Параметр -all задает отображение всех корневых элементов, а не только уникальных.
Адрес>объекта GCWhere< Отображает расположение и размер переданного аргумента в куче для сборки мусора. Если аргумент располагается в управляемой куче, но не является адресом допустимого объекта, размер отображается как "0" (нуль).
Справка (soshelp) [<команда>] [faq] Отображает все доступные команды при отсутствии параметров или, если указана команда, — подробные справочные сведения об этой команде.

Параметр faq задает отображение ответов на часто задаваемые вопросы.
HeapStat [-inclUnrooted-iu | ] Отображает размеры поколений для каждой кучи и общий объем свободного места в каждом поколении каждой кучи. Если указан параметр -inclUnrooted, отчет содержит сведения об управляемых объектах в куче для сборки мусора, которая больше не является корневой. Поддерживается только в Windows.
HistClear Освобождает все ресурсы, используемые семейством команд Hist.

Как правило, прямой вызов HistClear не требуется, так как каждая команда HistInit очищает предыдущие ресурсы.
HistInit Инициализирует структуры SOS из журнала нагрузки, сохраненного в отлаживаемом объекте.
Obj_address>HistObj< Проверяет все записи журнала перемещения нагрузки и отображает цепочку перемещений сборки мусора, которые могли привести к адресу, переданному в качестве аргумента.
HistObjFind<obj_address> Отображает все записи журнала, ссылающиеся на объект по указанному адресу.
Корень>HistRoot< Отображает сведения о повышениях и перемещениях указанного корневого элемента.

Корневое значение можно использовать для отслеживания движения объекта в сборках мусора.
Ip2MD (ip2md) <Code address> Отображает структуру MethodDesc по указанному адресу в коде после его JIT-компиляции.
ListNearObj (lno) <obj_address> Отображает объекты перед указанным адресом и после него. Команда находит в куче для сборки мусора адрес, напоминающий допустимое начало управляемого объекта (в зависимости от таблицы допустимых методов), и объект, следующий за адресом аргумента. Поддерживается только в Windows.
MinidumpMode [0] [1] Запрещает выполнение небезопасных команд при использовании минидампа.

Значение 0 отключает этот режим, а значение 1 включает его. По умолчанию значение MinidumpMode равно 0.

Минидампы, созданные с помощью команды .dump /m или .dump, содержат ограниченный набор данных, связанных с CLR, и позволяют корректно выполнять лишь часть команд SOS. Выполнение некоторых команд может завершаться сбоем из-за непредвиденных ошибок, вызываемых тем, что требуемые области памяти не сопоставлены или сопоставлены лишь частично. Данный параметр блокирует запуск небезопасных команд для минидампов.

Поддерживается только в WinDbg.
Тип имени>< модуля Name2EE (name2ee) <или имя метода>

-или-

Name2EE<имя> модуля !<имя типа или метода>
Отображает структуры MethodTable и EEClass для указанного типа или метода в указанном модуле.

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

Чтобы получить правильное имя типа, просмотрите модуль с помощью Ildasm.exe (дизассемблера IL). Можно также передать * в качестве параметра имени модуля, чтобы просматривались все загруженные управляемые модули. Параметр имя модуля может также содержать имя отладчика для модуля, например mscorlib или image00400000.

Эта команда поддерживает синтаксис отладчика Windows для <>moduletype>!<. Имя типа должно быть полным.
ObjSize [<адрес> объекта] | [-aggregate] [-stat] Отображает размер указанного объекта. Если параметры не указаны, команда ObjSize отображает размеры всех объектов, найденных в управляемых потоках, все дескрипторы сборщика мусора в данном процессе, а также общий размер всех объектов, указываемых этими дескрипторами. Команда ObjSize включает в размер каждого родительского объекта размер всех его дочерних объектов.

Параметр -aggregate можно использовать в сочетании с аргументом -stat, чтобы получить подробное представление типов, которые по-прежнему являются корневыми. С помощью !dumpheap -stat и !objsize -aggregate -stat можно определить, какие объекты больше не являются корневыми, и провести диагностику различных проблем с памятью.

Поддерживается только в Windows.
PrintException [-nested] [-lines] [<адрес> объекта исключения]

-или-

PE [вложенный] [<адрес >объекта исключения]
Отображает и форматирует поля всех производных объектов класса Exception, находящегося по указанному адресу. Если адрес не задан, команда PrintException отображает последнее исключение, возникшее в текущем потоке.

Параметр -nested задает отображение сведений о вложенных объектах исключений.

Если доступен, параметр -lines отображает сведения об источнике.

С помощью этой команды можно форматировать и просматривать поле _stackTrace, представляющее собой двоичный массив.
ProcInfo [ -env] [ -time] [ -mem] Отображает переменные среды для статистики процесса, процессорного времени ядра и использования памяти. Поддерживается только в WinDbg.
RCWCleanupList<Адрес RCWCleanupList> Отображает список вызываемых оболочек среды выполнения по указанному адресу, ожидающих очистки. Поддерживается только в WinDbg.
SaveModule<Базовый адрес><Имени файла> Записывает в указанный файл образ, загруженный в память по указанному адресу. Поддерживается только в WinDbg.
SetHostRuntime [<runtime-directory>] Эта команда задает путь к среде выполнения .NET Core, которая будет использоваться для размещения управляемого кода, выполняющегося в составе SOS в отладчике (lldb). Среда выполнения должна иметь версию не ниже 2.1.0. Если в имени каталога есть пробелы, необходимо использовать одинарные кавычки (').

Как правило, SOS пытается найти установленную среду выполнения .NET Core для автоматического запуска управляемого кода, а эту команду можно использовать в случае неудачного поиска. По умолчанию используется та же среда выполнения (libcoreclr), для которой выполняется отладка. Используйте эту команду, если среды выполнения, для которой выполняется отладка, недостаточно для выполнения кода SOS или если она имеет версию ниже 2.1.0.

Если при выполнении команды SOS возникает следующее сообщение об ошибке, используйте эту команду, чтобы задать путь к среде выполнения .NET Core 2.1.0 или более поздней версии.

(lldb) clrstack
Error: Fail to initialize CoreCLR 80004005 ClrStack failed

(lldb) sethostruntime /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.6

Для поиска пути к установленной среде выполнения .NET Core можно использовать команду "dotnet --info" в командной оболочке.
SetSymbolServer [-ms] [-disable] [-log] [-loadsymbols] [-cache<cache-path>] [-directory<search-directory>] [-sympath<windows-symbol-path>] [<symbol-server-URL>] Включает поддержку скачивания с сервера символов.

Параметр -ms разрешает скачивание с общедоступного сервера символов Майкрософт.

Параметр -disable включает поддержку скачивания символов.

Параметр -cache<cache-path> задает каталог кэша символов. Если этот каталог не задан, по умолчанию используется $HOME/.dotnet/symbolcache.

Параметр -directory добавляет путь для поиска символов. Можно задавать несколько путей.

Параметр -sympath добавляет пути к серверу, кэшу и каталогу в формате пути к символам Windows.

Параметр -log включает ведение журнала скачивания символов.

Параметр -loadsymbols пытается скачать собственные символы .NET Core для среды выполнения. Поддерживается в lldb и dotnet-dump.
SOSFlush Очищает внутренний кэш SOS.
SOSStatus [ -reset] Отображает внутреннее состояние SOS или сбрасывает внутреннее кэшированное состояние.
StopOnException [-производный] [-create-create2 | ] <Номер псевдорегистрированияисключения><> Предписывает отладчику остановиться при возникновении указанного исключения и продолжать работу при возникновении других исключений.

Параметр -derived задает перехват указанного исключения и всех производных от него исключений.

Поддерживается только в WinDbg.
SyncBlk [-all | < номер >syncblk] Отображает указанную структуру SyncBlock или все структуры SyncBlock. При отсутствии аргументов команда SyncBlk отображает структуру SyncBlock, соответствующую объектам, владельцем которых является поток.

Структура SyncBlock представляет собой контейнер для дополнительной информации, которую необязательно создавать для каждого объекта. Она может включать данные COM-взаимодействия и сведения о блокировке для потокобезопасных операций.
ThreadPool Отображает сведения о пуле управляемых потоков, включая число рабочих запросов в очереди, число потоков портов завершения и число таймеров.
Threads (clrthreads) [ -live] [ -special] Отображает все управляемые потоки в процессе.

Команда Threads отображает сокращенный идентификатор отладчика, идентификатор потока среды CLR и идентификатор потока операционной системы. Кроме того, команда Threads отображает столбец Domain, содержащий домен приложения, в котором выполняется поток, столбец APT, в котором показан режим COM-контейнера, и столбец Exception, где указано последнее исключение, возникшее в потоке.

Параметр -live задает отображение потоков, связанных с активным потоком.

Параметр -special задает отображение всех специальных потоков, созданных средой CLR. К специальным потокам относятся потоки сборки мусора (для параллельной сборки мусора и серверной сборки мусора), вспомогательные потоки отладчика, потоки метода завершения, потоки выгрузки AppDomain и потоки таймера пула потоков.
ThreadState <значение поля состояния> Отображает состояние потока. Параметр value представляет собой значение поля State в выводе отчета Потоки.
Token2EE<имя>< модуля Маркер> Преобразует указанный токен метаданных указанного модуля в структуру MethodTable или MethodDesc.

В качестве параметра имени модуля можно указать *, чтобы узнать, с чем сопоставляется токен в каждом из загруженных управляемых модулей. Можно также задать имя отладчика для модуля, например mscorlib или image00400000.
U [-gcinfo] [-ehinfo] [-n] <Адрес метода> | <Адрес кода> Отображает дизассемблированный код с примечаниями для управляемого метода, заданного указателем структуры MethodDesc или адресом кода в теле метода. Команда U отображает весь метод от начала до конца, с примечаниями, преобразующими токены метаданных в имена.

Параметр -gcinfo предписывает команде U отобразить структуру GCInfo метода.

Параметр -ehinfo задает отображение сведений об исключениях в методе. Эту информацию можно также получить с помощью команды EHInfo.

Параметр -n отключает отображение имен исходных файлов и номеров строк. Если для отладчика указан параметр "SYMOPT_LOAD_LINES", расширение отладчика SOS ищет символы для каждого управляемого кадра и в случае успеха отображает соответствующее имя исходного файла и номер строки. Чтобы отключить это поведение, можно указать параметр -n.
VerifyHeap Проверяет кучу сборщика мусора на наличие признаков повреждения и отображает обнаруженные ошибки.

Повреждения кучи могут быть вызваны неправильно созданными вызовами неуправляемого кода.
VerifyObj<адрес объекта> Проверяет объект, передаваемый в качестве аргумента, на наличие повреждений. Поддерживается только в Windows.
VMMap Выполняет обход виртуального адресного пространства и отображает тип защиты для каждого региона. Поддерживается только в WinDbg.
VMStat Создает сводное представление виртуального адресного пространства, упорядоченное по типам защиты соответствующих видов памяти (свободная, зарезервированная, выделенная, закрытая, отображаемая, образ). В столбце "TOTAL" содержится результат умножения значения в столбце "AVERAGE" на значение в столбце "BLK COUNT". Поддерживается только в WinDbg.

Dotnet-Dump

Список доступных команд SOS с dotnet-dump analyze см. в разделе dotnet-dump.

Отладчик Windows

Расширение отладки SOS можно также загрузить в отладчик WinDbg/db и выполнять команды в отладчике Windows. Команды SOS можно использовать для активных процессов или дампов.

Windbg должен автоматически загружать расширение SOS всякий раз, когда отлаживаемый процесс содержит среду выполнения .NET Core (coreclr.dll или libcoreclr.so).

Отладчик LLDB

Инструкции по настройке расширения SOS для LLDB см. в разделе dotnet-sos. Команды SOS можно использовать для активных процессов или дампов.

По умолчанию можно получить доступ ко всем командам SOS, введя sos [command_name]. Тем не менее стандартные команды имеют псевдонимы, в связи с чем префикс sos не нужен:

Команда Функция
analyzeoom Отображает сведения о последней OOM, возникшем в запросе на выделение в кучу сборки мусора.
bpmd Создание точки останова в указанном управляемом методе указанного модуля.
clrmodules Список управляемых модулей в процессе.
clrstack Обеспечивает трассировку стека только для управляемого кода.
clrthreads Список управляемых потоков, которые выполняются.
clru Отображение дизассемблированного кода с аннотациями для управляемого метода.
dbgout Включает или отключает (-off) внутреннее ведение журнала SOS.
dso Отображает все управляемые объекты, обнаруженные в пределах границ текущего стека.
dumpalc Отображает сведения о сборочном объекте AssemblyLoadContext, в который загружается указанный объект.
dumparray Отображает сведения об управляемом массиве.
dumpasync Отображение сведений об асинхронных конечных автоматах для кучи со сборкой мусора.
dumpassembly Отображение сведений о сборке.
dumpclass Отображение сведений о структуре EEClass, находящейся по указанному адресу.
dumpconcurrentdictionary Отображает параллельное содержимое словаря.
dumpconcurrentqueue Отображает параллельное содержимое очереди.
dumpdelegate Отображение сведений о делегате.
dumpdomain Отображает сведения обо всех сборках в пределах всех доменов appdomain или указанного.
dumpgcdata Отображает сведения о данных сборки мусора.
dumpgen Отображает содержимое кучи для указанного поколения.
dumpheap Отображение сведений о куче со сборкой мусора и статистики сборки мусора по объектам.
dumpil Отображает промежуточный язык Майкрософт (MSIL), связанный с управляемым методом.
dumplog Записывает в указанный файл содержимое журнала нагрузок, хранящегося в памяти.
dumpmd Отображение сведений о структуре MethodDesc, находящейся по указанному адресу.
dumpmodule Отображение сведений о модуле, находящемся по указанному адресу.
dumpmt Отображение сведений о таблице методов, расположенной по указанному адресу.
dumpobj Отображение сведений об объекте, находящемся по указанному адресу.
dumpruntimetypes Находит все объекты System.RuntimeType в куче сборки мусора и выводит имя типа и MethodTable, на которые они ссылаются.
dumpsig Дамп сигнатуры метода или поля, заданного параметром <sigaddr> <moduleaddr>.
dumpsigelem Создает дамп одного элемента объекта сигнатуры.
dumpstack Отображение трассировки машинного и управляемого стека.
dumpstackobjects Отображает все управляемые объекты, обнаруженные в пределах границ текущего стека.
dumpvc Отображает сведения о полях класса значений.
eeheap Отображение сведений о памяти процессов, занятой внутренними структурами данных среды выполнения.
eestack Выполнение команды dumpstack для всех потоков в составе процесса.
eeversion Отображает сведения о версиях среды выполнения и SOS.
ehinfo Отображает блоки обработки исключений в методе JIT-ed.
finalizequeue Отображает все объекты, зарегистрированные для заключительной обработки.
findappdomain Пытается разрешить AppDomain объекта сборки мусора.
findroots Находит и отображает корневые объекты в коллекциях сборки мусора.
gchandles Отображает статистику дескрипторов сборщика мусора в составе процесса.
gcheapstat Отображает статистику по сборщику мусора.
gcinfo Отображает JIT-кодирование сборки мусора для метода.
gcroot Отображение сведений о ссылках (или корневых элементах) объекта, который расположен по указанному адресу.
gcwhere Отображает расположение указанного адреса в куче сборки мусора.
histclear Освобождение всех ресурсов, используемых семейством команд Hist.
histinit Инициализирует структуры SOS из журнала нагрузки, сохраненного в отлаживаемом объекте.
histobj Проверяет все записи журнала перемещения нагрузки и отображает цепочку перемещений сборки мусора, которые могли привести к адресу, переданному в качестве аргумента.
histobjfind Отображение всех записей журнала, ссылающихся на объект по указанному адресу.
histroot Отображает сведения о повышениях и перемещениях указанного корневого элемента.
histstats Отображает статистику журнала стресса.
ip2md Отображает структуру MethodDesc по указанному адресу в коде после его JIT-компиляции.
listnearobj Отображает объект , предшествующий указанному адресу и следующий за ней.
loadsymbols Загружает символы собственного модуля .NET Core.
logging Включает или отключает внутреннее ведение журнала SOS.
name2ee Отображение структур MethodTable и EEClass для указанного типа или метода в указанном модуле.
objsize Отображает размер указанного объекта.
parallelstacks Отображает стек объединенных потоков аналогично панели Параллельные стеки Visual Studio.
pathto Отображает путь сборки мусора от <root> до <target>.
pe Отображает и форматирует поля всех производных объектов класса Exception, находящегося по указанному адресу.
printexception Отображает и форматирует поля всех производных объектов класса Exception, находящегося по указанному адресу.
runtimes Выводит список сред выполнения в целевом объекте или изменяет среду выполнения по умолчанию.
stoponcatch Целевой процесс будет прерываться при следующем перехвате управляемого исключения во время выполнения.
setclrpath Задание пути для загрузки файлов coreclr dac/dbi. setclrpath <path>.
sethostruntime Задание или отображение каталога среды выполнения .NET Core, который используется для запуска управляемого кода в SOS.
setsymbolserver Включение поддержки сервера символов.
setsostid Задание текущего индекса TID или потока операционной системы вместо предоставляемого средством lldb. setsostid <tid> <index>.
sos Выполняет различные команды отладки coreclr. Используйте синтаксис sos <command-name> <args>. Дополнительные сведения можно получить с помощью команды soshelp.
soshelp Отображает все доступные команды, если параметр не указан, или отображает подробные справочные сведения об указанной команде: soshelp <command>.
syncblk Отображение сведений о заполнителе SyncBlock.
taskstate Отображает состояние задачи в удобочитаемом формате.
threadpool Отображает сведения о пуле потоков среды выполнения.
threadpoolqueue Отображает рабочие элементы пула потоков в очереди.
threadstate Довольно выводит значение состояния потоков.
timerinfo Отображает сведения о выполнении таймеров.
token2ee Отображает структуру MethodTable и структуру MethodDesc для указанного токена и модуля.
traverseheap Записывает сведения о куче в файл в формате, понятном профилировщику CLR.
verifyheap Проверяет кучу сборки мусора на наличие признаков повреждения.
verifyobj Проверяет объект, передаваемый в качестве аргумента, на наличие повреждений.

Пример использования Windbg/cdb

Get-Help Описание
!dumparray -start 2 -length 5 -details 00ad28d0 Отображение содержимого массива по адресу 00ad28d0. Отображаются данные для пяти элементов массива, начиная со второго.
!dumpassembly 1ca248 Отображение содержимого сборки по адресу 1ca248.
!dumpheap Отображение сведений о куче сборщика мусора.
!DumpLog Запись содержимого журнала нагрузок в памяти в файл "StressLog.txt" (по умолчанию), расположенный в текущем каталоге.
!dumpmd 902f40 Отображение структуры MethodDesc по адресу 902f40.
!dumpmodule 1caa50 Отображение сведений о модуле, находящемся по адресу 1caa50.
!DumpObj a79d40 Отображение сведений об объекте, находящемся по адресу a79d40.
!DumpVC 0090320c 00a79d9c Отображение полей класса значений по адресу 00a79d9c с использованием таблицы методов по адресу 0090320c.
!eeheap -gc Отображение памяти процесса, используемой сборщиком мусора.
!finalizequeue Отображение всех объектов, запланированных для заключительной обработки.
!findappdomain 00a79d98 Определение домена приложения для объекта, находящегося по адресу 00a79d98.
!gcinfo 5b68dbb8 Отображение всех дескрипторов сборщика мусора в текущем процессе.
!name2ee unittest.exe MainClass.Main Отображение структур MethodTable и EEClass для метода Main класса MainClass в модуле unittest.exe.
!token2ee unittest.exe 02000003 Отображение сведений о токене метаданных по адресу 02000003 в модуле unittest.exe.

Пример использования LLDB

Get-Help Описание
dumparray -start 2 -length 5 -details 00ad28d0 Отображение содержимого массива по адресу 00ad28d0. Отображаются данные для пяти элементов массива, начиная со второго.
dumpassembly 1ca248 Отображение содержимого сборки по адресу 1ca248.
dumpheap Отображение сведений о куче сборщика мусора.
dumplog Запись содержимого журнала нагрузок в памяти в файл "StressLog.txt" (по умолчанию), расположенный в текущем каталоге.
dumpmd 902f40 Отображение структуры MethodDesc по адресу 902f40.
dumpmodule 1caa50 Отображение сведений о модуле, находящемся по адресу 1caa50.
dumpobj a79d40 Отображение сведений об объекте, находящемся по адресу a79d40.
dumpvc 0090320c 00a79d9c Отображение полей класса значений по адресу 00a79d9c с использованием таблицы методов по адресу 0090320c.
eeheap -gc Отображение памяти процесса, используемой сборщиком мусора.
findappdomain 00a79d98 Определение домена приложения для объекта, находящегося по адресу 00a79d98.
gcinfo 5b68dbb8 Отображение всех дескрипторов сборщика мусора в текущем процессе.
name2ee unittest.exe MainClass.Main Отображение структур MethodTable и EEClass для метода Main класса MainClass в модуле unittest.exe.
token2ee unittest.exe 02000003 Отображение сведений о токене метаданных по адресу 02000003 в модуле unittest.exe.
clrthreads Отображение управляемых потоков.

См. также раздел