SOS.dll (расширение отладки SOS)
Расширение отладки SOS (SOS.dll) помогает отлаживать управляемые программы в отладчике WinDbg.exe и в Visual Studio, предоставляя информацию о внутренней общеязыковой среде выполнения (CLR). Это средство требует, чтобы в проекте была включена неуправляемая отладка. Можно также использовать расширение отладки SOS с отладчиком Windows (WinDbg.exe).
Это средство устанавливается автоматически с Visual Studio и пакетом SDK Windows. Чтобы запустить инструмент, мы рекомендуем использовать командную строку Visual Studio или командную строку пакета Windows SDK (командную оболочку). Эти служебные программы позволяют легко работать с инструментом, не переходя к папке установки. Дополнительные сведения см. в разделе Командная строка Visual Studio и пакета Windows SDK.
Если на компьютере установлена среда Visual Studio: на панели задач последовательно щелкните Start, All Programs, Visual Studio, Visual Studio Tools и Visual Studio Command Prompt.
– или –
Если на компьютере установлен пакет Windows SDK: на панели задач щелкните Start, выберите All Programs и откройте папку с пакетом Windows SDK, затем щелкните Command Prompt (или CMD Shell).
В командной строке введите следующее:
![command] [options]
Команды
Command |
Описание |
---|---|
AnalyzeOOM (ao) |
Отображает сведения для последнего OOM, произошедшего при запросе на выделение памяти в куче сборщика мусора. (В сборке мусора сервера отображает OOM, если имеется, в каждой куче сборки мусора.) |
BPMD [-nofuturemodule] [<имя_модуля> <имя_метода>] [-md <MethodDesc>] -list -clear <точка_ожидания_останова> -clearall |
Создает точку останова в указанном методе указанного модуля. Если указанные модуль и метод не загружены, команда ожидает уведомления о загрузке и выполнении JIT-компиляции метода, прежде чем создавать точку останова. Можно управлять списком точек ожидания останова с помощью параметров -list, -clear и -clearall:
|
CLRStack [-a] [-l] [-p] [-n] |
Предоставляет трассу стека только для управляемого кода.
Расширение отладки SOS не отображает кадры переходов на платформах x64 и IA-64. |
COMState |
Выдает список моделей подразделений COM для каждого потока и указатель Context, если он имеется. |
DumpArray [-start <начальный_индекс>] [-length <длина>] [-details] [-nofields] <адрес_объекта_массива> – или – DA [-start <начальный_индекс>] [-length <длина>] [-detail] [-nofields] адрес_объекта_массива> |
Анализирует элементы объекта массива.
|
DumpAssembly <адрес_сборки> |
Отображает информацию о сборке. Команда DumpAssembly выводит список модулей, если они существуют. Адрес сборки можно получить с помощью команды DumpDomain. |
DumpClass <адрес_EEClass> |
Отображает информацию о структуре EEClass, связанной с типом. Команда DumpClass выводит значения статических полей; значения нестатических полей не выводятся. С помощью команды DumpMT, DumpObj, Name2EE или Token2EE получите адрес структуры EEClass. |
DumpDomain [<адрес_домена>] |
Перечисляет все объекты Assembly, загруженные по указанному адреса объекта AppDomain. При вызове без параметров команда DumpDomain выводит список всех объектов AppDomain в составе процесса. |
DumpHeap [-stat] [-strings] [-short] [-min <размер>] [-max <размер>] [-thinlock] [-startAtLowerBound] [-mt <адрес_MethodTable>] [-type <частичное_имя_типа>][начало [конец]] |
Отображает информацию о куче сборщика мусора и статистику сбора мусора по объектам. В случае чрезмерной фрагментации кучи сборщика мусора команда DumpHeap выдает соответствующее предупреждение.
|
DumpIL <управляемый_объект_DynamicMethod> | <указатель_DynamicMethodDesc> | <указатель_MethodDesc> |
Отображает код MSIL, связанный с управляемым методом. Следует иметь в виду, что динамический язык MSIL генерируется иначе, чем язык MSIL, загруженный из сборки. Динамический язык MSIL относится к объектам внутри управляемого объекта-массива, а не к токенам метаданных. |
DumpLog-addr < addressOfStressLog>] [<e имя_файла >] |
Записывает в указанный файл содержимое журнала нагрузок, хранящегося в памяти. Если имя не указано, команда создает файл 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 задает вывод списка всех методов, определенных вместе с объектом. Каждый управляемый объект содержит указатель на таблицу методов. |
DumpMethodSig <подпись_метода> <адрес_модуляr> |
Отображает информацию о структуре MethodSig, находящейся по указанному адресу. |
DumpModule [-mt] <адрес_модуля> |
Отображает информацию о модуле, находящемся по указанному адресу. Параметр -mt задает вывод типов, определенных в модуле, и типов, на которые имеются ссылки в модуле. Для получения адреса модуля можно использовать команду DumpDomain или DumpAssembly. |
DumpObj [-nofields] <адрес_объекта> – или – DO <адрес_объекта> |
Отображает информацию об объекте, находящемся по указанному адресу. Команда DumpObj выводит список полей, сведения о структуре EEClass, таблицу методов и размер объекта. Для получения адреса объекта можно использовать команду DumpStackObjects. Следует иметь в виду, что команду DumpObj можно выполнять для полей типа CLASS, поскольку они также являются объектами. Параметр -nofields не позволяет отображаться полям объекта, что полезно для таких объектов, как String. |
DumpRuntimeTypes |
Отображает типы среды выполнения в куче сборщика мусора и выводит список соответствующих имен типов и таблиц методов. |
DumpStack [-EE] [-n] [top стек [bottom stack]] |
Отображает трассу стека.
На платформах x86 и x64 команда DumpStack создает подробную трассу стека. На платформах IA-64 команда DumpStack действует аналогично команде отладчика K. На платформах IA-64 параметры top и bottom игнорируются. |
DumpSig <адрес_подписи> <адрес_модуля> |
Отображает информацию о структуре Sig, находящейся по указанному адресу. |
DumpSigElem <адрес_подписи> <адрес_модуля> |
Отображает единственный объекта сигнатуры. В большинстве случаев следует использовать DumpSig для просмотра отдельных объектов сигнатур. Тем не менее, если сигнатура каким-то образом повреждена, можно использовать DumpSigElem для чтения ее допустимых частей. |
DumpStackObjects [-verify] [top стек [bottom стек]] – или – DSO [-verify] [top стек [bottom стек]] |
Отображает все управляемые объекты, обнаруженные в пределах границ текущего стека. Параметр -verify задает проверку каждого нестатического поля CLASS в поле объекта. Для определения значений локальных переменных и параметров используйте команду DumpStackObject вместе с командами трассировки стека, такими как K и CLRStack. |
DumpVC <адрес_MethodTable> <адрес> |
Отображает информацию о полях класса значений, находящегося по указанному адресу. Параметр MethodTable позволяет команде DumpVC правильно интерпретировать поля. В классах значений первое поле не содержит таблицу методов. |
EEHeap [-gc] [-loader] |
Отображает информацию о памяти процессов, занимаемой внутренними структурами данных среды CLR. Параметры -gc и -loader ограничивают выходные данные этой команды только сведениями о структурах данных сборщика мусора и загрузчика. Информация о сборщике мусора включает диапазоны каждого сегмента в управляемой куче. Если указатель попадает в диапазон сегмента, заданный параметром -gc, значит, он является указателем объекта. |
EEStack [-short] [-EE] |
Выполняет команду DumpStack для всех потоков в составе процесса. Параметр -EE передается непосредственно в команду DumpStack. Параметр -short ограничивает выходные данные следующими видами потоков:
|
EEVersion |
Отображает версию среды CLR. |
EHInfo [<адрес_MethodDesc>] [<адрес_кода>] |
Отображает блоки обработки исключений в указанном методе. Данная команда выводит адреса кода и смещения для блока предложений (блока try) и блока обработчика (блока catch). |
FAQ |
Отображает вопросы и ответы. |
FinalizeQueue [-detail] | [-allReady] [-short] |
Отображает все объекты, зарегистрированные для заключительной обработки.
|
FindAppDomain <адрес_объекта> |
Определяет домен приложения для объекта, находящегося по указанному адресу. |
FindRoots -gen <N> | -gen any |<адрес_объекта> |
Вызывает остановку отладчика в отлаживаемом объекте следующей коллекции заданного поколения. Эффект сбрасывается, как только произойдет останов. Чтобы остановиться на следующей коллекции, необходимо повторное выполнение команды. Форма <адрес_объекта> этой команды используется после возникновения прерывания, вызванного -gen или -gen any. В этот момент отлаживаемый процесс находится в правильном состоянии для FindRoots для идентификации корневых папок для объектов из поколений, уничтожаемых в данный момент. |
GCHandles [-perdomain] |
Отображает статистику дескрипторов сборщика мусора в составе процесса. Параметр -perdomain упорядочивает статистику по доменам приложений. Команда GCHandles служит для поиска утечек памяти, вызываемых утечками дескрипторов сборщика мусора. Например, утечка памяти происходит, когда в коде продолжает использоваться большой массив, поскольку на него еще указывает строгий дескриптор сборщика мусора, а сам дескриптор удаляется без освобождения памяти. |
GCHandleLeaks |
Ищет в памяти ссылки на строгие и закрепленные дескрипторы сборщика мусора в рамках процесса и выводит результаты. При обнаружении дескриптора команда GCHandleLeaks отображает адрес ссылки. Если дескриптор в памяти не найден, выдается уведомление. |
GCInfo <адрес_MethodDesc><адрес_кода> |
Отображает данные, показывающие, содержатся ли управляемые объекты в регистрах или ячейках стека. Если производится сбор мусора, сборщик должен знать расположение ссылок на объекты, чтобы их можно было обновить новыми значениями указателей объектов. |
GCRoot [-nostacks] <адрес_объекта> |
Отображает информацию о ссылках (или корнях) объекта, находящегося по указанному адресу. Команда GCRoot анализирует всю управляемую кучу и таблицу дескрипторов в поисках дескрипторов, находящихся в других объектах или в стеке. Затем каждый стек просматривается в поисках указателей на объекты; просматривается и очередь метода завершения. Данная команда не определяет, является ли корень стека допустимым или он удален. Используйте команды CLRStack и U, чтобы дизассемблировать кадр, к которому принадлежит локальное значение или значение аргумента, и определить, используется ли еще корень стека. Параметр -nostacks ограничивает поиск дескрипторами сборщика мусора и объектами freachable. |
GCWhere <адрес_объекта> |
Отображает расположение и размер в куче сборщика мусора переданного аргумента. Если аргумент располагается в управляемой куче, но не является адресом допустимого объекта, размер отображается в виде 0 (ноль). |
help [<команда>] [faq] |
Отображает все доступные команды при отсутствии параметров или, если указана команда, подробные справочные сведения об этой команде. Параметр faq задает вывод ответов на часто задаваемые вопросы. |
HeapStat [-inclUnrooted | -iu] |
Отображает размеры поколений для каждой кучи и общее количество свободного места в каждом поколении каждой кучи. Если указан параметр inclUnrooted, отчет содержит сведения об управляемых объектах в куче сборщика мусора, которая больше не является корнем. |
HistClear |
Освобождает все ресурсы, используемые семейством команд Hist. Как правило у вас нет для явного вызова HistClear, так как каждый HistInit очищает предыдущие ресурсы. |
HistInit |
Инициализирует структуры SOS из журнала нагрузки, сохраненного в отлаживаемом процессе. |
HistObj <адрес_объекта> |
Проверяет все записи журнала перемещения нагрузки и отображает цепочку перемещений сборки мусора, которые могли привести к адресу, переданному в качестве аргумента. |
HisttObjFind <obj_address> |
Отображает все записи журнала, ссылающиеся на объект по указанному адресу. |
HistRoot <корень> |
Отображает сведения о специальных предложениях и перемещениях указанного корня. Корневое значение можно использовать для отслеживания движения объекта при сборке мусора. |
IP2MD <адрес_кода> |
Отображает структуру MethodDesc по указанному адресу в коде после его JIT-компиляции. |
ListNearObj (lno) <адрес_объекта> |
Отображает объекты перед и после указанного адреса. Команда находит в куче сборщика мусора адрес, напоминающий допустимое начало управляемого объекта (в зависимости от таблицы допустимых методов) и объект, следующий за адресом аргумента. |
MinidumpMode [0] [1] |
Запрещает выполнение небезопасных команд при использовании минидампа. Значение 0 отключает этот режим, а значение 1 включает его. По умолчанию MinidumpMode имеет значение 0. Минидампы, созданные с помощью команды .dump /m или .dump, содержат ограниченный набор данных, связанных с CLR, и позволяют корректно выполнять лишь часть команд SOS. Выполнение некоторых команд может завершаться сбоем из-за непредвиденных ошибок, вызываемых тем, что требуемые области памяти не отображены или отображены лишь частично. Данный параметр блокирует запуск небезопасных команд для минидампов. |
Name2EE <имя_модуля> <имя_типа_или_метода> – или – Name2EE <имя_модуля>!<имя_типа_или_метода> |
Отображает структуру MethodTable и структуру EEClass для указанного типа или метода в указанном модуле. Указанный модуль должен быть загружен в рамках процесса. Для получения требуемого имени типа просмотрите модуль, используя Ildasm.exe (дизассемблер MSIL). Можно также задать * в качестве имени модуля, чтобы просматривались все загруженные управляемые модули. Параметр имя_модуля может также содержать имя отладчика для модуля, такое как mscorlib или image00400000. Данная команда поддерживает следующий синтаксис отладчика Windows: <module>!<type>. Имя типа должно быть полным. |
ObjSize [<адрес_объекта>] | [-aggregate] [-stat] |
Отображает размер указанного объекта. Если никакие параметры не указаны, команда ObjSize выводит размеры всех объектов, найденных в управляемых потоках, все дескрипторы сборщика мусора в данном процессе, а также общий размер всех объектов, указываемых этими дескрипторами. Команда ObjSize включает в размер каждого объекта размеры всех его дочерних объектов. Параметр -aggregate можно использовать в сочетании с аргументом -stat для получения подробного представления типов, которые по-прежнему являются корневыми. С помощью !dumpheap -stat и !objsize -aggregate -stat можно определить, какие объекты больше не являются корневыми и диагностировать различные проблемы с памятью. |
PrintException [-nested] [-lines] [<адрес_объекта_исключения>] – или – PE [-nested] [<адрес_объекта_исключения>] |
Отображает и форматирует поля всех производных объектов класса Exception, находящегося по указанному адресу. Если адрес не задан, команда PrintException отображает последнее исключение, возникшее в текущем потоке.
С помощью этой команды можно форматировать и просматривать поле _stackTrace, представляющее двоичный массив. |
ProcInfo [-env] [-time] [-mem] |
Отображает переменные среды для статистики процесса, процессорного времени ядра и использования памяти. |
RCWCleanupList <адрес_RCWCleanupList> |
Отображает список вызываемых оболочек времени выполнения по указанному адресу, ожидающих очистки. |
SaveModule <базовый_адрес> <имя_файла> |
Записывает в указанный файл образ, загруженный в память по указанному адресу. |
SOSFlush |
Очищает внутренний кэш SOS. |
StopOnException [-derived] [-create | -create2] <исключение> <номер псевдорегистра> |
Предписывает отладчику остановиться при генерации указанного исключения и продолжать работу при генерации других исключений. Параметр -derived задает перехват указанного исключения и всех производных от него исключений. |
SyncBlk [-all | <номер_syncblk>] |
Отображает указанную структуру SyncBlock или все структуры SyncBlock. При отсутствии аргументов команда SyncBlk отображает структуру SyncBlock, соответствующую объектам, владельцем которых является поток. Структура SyncBlock представляет собой контейнер для дополнительной информации, которую необязательно создавать для каждого объекта. Она может включать данные COM-взаимодействия и сведения о блокировке для потокобезопасных операций. |
ThreadPool |
Отображает информацию о пуле управляемых потоков, включая число рабочих запросов в очереди, число потоков портов завершения и число таймеров. |
Token2EE <имя_модуля> <маркер> |
Преобразовывает указанный маркер метаданных указанного модуля в структуру MethodTable или структуру MethodDesc. В качестве имени модуля можно указать *, чтобы узнать, во что отображается маркер в каждом из загруженных управляемых модулей. Можно также задать имя отладчика для модуля, например mscorlib или image00400000. |
Threads [-live] [-special] |
Отображает все управляемые потоки в процессе. Команда Threads выводит сокращенный идентификатор отладчика, идентификатор потока CLR и идентификатор потока операционной системы. Кроме того, команда Threads выводит столбец Domain, содержащий домен приложения, в котором выполняется поток, столбец APT, в котором показан режим COM-подразделения, и столбец Exception, где указано последнее исключение, сгенерированное в потоке.
|
ThreadState <Поле значения состояния> |
Отображает состояние потока. Параметр value представляет собой значение поля State в выводе отчета Threads. Пример:
|
TraverseHeap [-xml] <имя_файла> |
Записывает данные кучи в указанный файл в формате, распознаваемом профилировщиком CLR. Параметр -xml предписывает команде TraverseHeap преобразовать файл в формат XML. Профилировщик CLR можно загрузить из Центра загрузки Майкрософт. |
U [-gcinfo] [-ehinfo] [-n] <адрес_MethodDesc> | <адрес_кода> |
Отображает дизассемблированный код с примечаниями для управляемого метода, заданного указателем структуры MethodDesc или адресом кода внутри тела метода. Команда U отображает весь метод от начала до конца, с примечаниями, преобразующими маркеры метаданных в имена.
|
VerifyHeap |
Проверяет кучу сборщика мусора на наличие признаков повреждения и отображает обнаруженные ошибки. Повреждения кучи могут быть вызваны неправильно определенными вызовами неуправляемого кода. |
VerifyObj <адрес_объекта> |
Проверяет объект, передаваемый в качестве аргумента, на признаки повреждения. |
VMMap |
Выполняет обход виртуального адресного пространства и отображает тип защиты для каждого региона. |
VMStat |
Создает сводное представление виртуального адресного пространства, упорядоченное по типам защиты соответствующих видов памяти (свободная, зарезервированная, выделенная, закрытая, отображаемая, образ). В столбце TOTAL содержится результат умножения значения столбца AVERAGE на значение столбца BLK COUNT. |
Заметки
Для работы с расширением отладки SOS его следует загрузить в отладчик WinDbg.exe, также доступный на сайте WDK и средств разработки, или в Visual Studio. Команды можно выполнять в среде WinDgb.exe или в окне Интерпретация в Visual Studio.
Расширение отладки SOS позволяет просматривать информацию о коде, выполняемом в среде CLR. Например, с помощью расширения отладки SOS можно получать сведения об управляемой куче, искать повреждения кучи, отображать внутренние типы данных, используемые средой выполнения, и просматривать информацию о любом управляемом коде, запущенном в среде выполнения.
Загрузка расширения отладки SOS
Чтобы загрузить расширение отладки SOS в отладчик WinDbg.exe, выполните в средстве следующую команду:
.loadby sos clr
Чтобы загрузить расширение отладки SOS в Visual Studio, во время отладки выполните в окне Интерпретация следующую команду:
.load SOS.dll
Если команда будет выполнена успешно, в окне Интерпретация появится следующее сообщение:
extension C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\sos.dll loaded
Перед загрузкой расширения отладки SOS необходимо включить отладку неуправляемого кода в настройках проекта решения. В некоторых языковых версиях отладка неуправляемого кода по умолчанию отключается. Некоторые платформы не позволяют одновременно отлаживать управляемый и неуправляемый код.
![]() |
---|
Чтобы открыть окно Интерпретация в Visual Studio, в меню Отладка наведите указатель на пункт Окна и выберите Интерпретация.Окно Интерпретация в Visual Studio можно также открыть, нажав клавиши CTRL+ALT+I. |
WinDbg.exe и Visual Studio используют версию SOS.dll, которая соответствует используемой в данный момент версии Mscorwks.dll. В версиях .NET Framework 1.1 и 2.0 файл SOS.dll устанавливается в том же каталоге, что и Mscorwks.dll. По умолчанию следует использовать версию SOS.dll, соответствующую текущей версии Mscorwks.dll.
Чтобы использовать файл дампа, созданный на другом компьютере, убедитесь, что файл Mscorwks.dll, поступивший вместе с этой установленной копией, указан в пути к символам в данной системе, и загрузите соответствующую версию SOS.dll.
Чтобы загрузить определенную версию SOS.dll, введите в окне отладчика Windows следующую команду:
.load <full path to sos.dll>
Примеры
Следующая команда отображает содержимое массива по адресу 00ad28d0. Выводятся данные для пяти элементов массива, начиная со второго.
!dumparray -start 2 -length 5 -detail 00ad28d0
Следующая команда отображает содержимое сборки по адресу 1ca248.
!dumpassembly 1ca248
Следующая команда отображает информацию о куче сборщика мусора.
!dumpheap
Следующая команда записывает содержимое журнала нагрузок в памяти в файл StressLog.txt (по умолчанию), расположенный в текущем каталоге.
!DumpLog
Следующая команда отображает структуру MethodDesc по адресу 902f40.
!dumpmd 902f40
Следующая команда отображает информацию о модуле по адресу 1caa50.
!dumpmodule 1caa50
Следующая команда отображает информацию об объекте по адресу a79d40.
!DumpObj a79d40
Следующая команда отображает поля класса значений по адресу 00a79d9c, используя таблицу методов по адресу 0090320c.
!DumpVC 0090320c 00a79d9c
Следующая команда отображает память процесса, используемую сборщиком мусора.
!eeheap -gc
Следующая команда отображает все объекты, запланированные для заключительной обработки.
!finalizequeue
Следующая команда находит домен приложения для объекта по адресу 00a79d98.
!findappdomain 00a79d98
Следующая команда отображает все дескрипторы сборщика мусора в текущем процессе.
!gcinfo 5b68dbb8
Следующая команда отображает структуры MethodTable и EEClass для метода Main класса MainClass в модуле unittest.exe.
!name2ee unittest.exe MainClass.Main
Следующая команда отображает информацию о маркере метаданных по адресу 02000003 в модуле unittest.exe.
!token2ee unittest.exe 02000003
См. также
Ссылки
Командная строка Visual Studio и пакета Windows SDK
Другие ресурсы
Журнал изменений
Дата |
Журнал |
Причина |
---|---|---|
Апрель 2011 |
Добавлены сведения об использовании командных строк Visual Studio и Windows SDK. |
Улучшение информации. |