Расширение отладки SOS (SOS.dll)
Обновлен: Ноябрь 2007
Расширение отладки SOS (SOS.dll) помогает отлаживать управляемые программы в отладчике WinDbg.exe и в Visual Studio, предоставляя информацию о внутренней общеязыковой среде выполнения (CLR).
![command] [options]
Команды
Команда |
Описание |
---|---|
BPMD [<имя_модуля> <имя_метода>] [-md <MethodDesc>] |
Создает точку останова в указанном методе указанного модуля. Если указанные модуль и метод не загружены, команда ожидает уведомления о загрузке и выполнении JIT-компиляции метода, прежде чем создавать точку останова. |
CLRStack [-a] [-l] [-p] |
Предоставляет трассу стека только для управляемого кода. Параметр -p задает отображение аргументов управляемой функции. Параметр -l задает вывод информации о локальных переменных в кадре. Расширение отладки SOS не позволяет извлекать локальные имена, поэтому результаты для локальных имен выводятся в формате <локальный_адрес> = <значение>. Параметр -a (all — все) заменяет собой комбинацию параметров -l и -p. Расширение отладки SOS не отображает кадры переходов на платформах x64 и IA-64. |
COMState |
Выдает список моделей подразделений COM для каждого потока и указатель Context, если он имеется. |
DumpArray [-start <начальный_индекс>] [-length <длина>] [-details] [-nofields] <адрес_объекта_массива> -или- DA [-start <начальный_индекс>] [-length <длина>] [-detail] [-nofields] адрес_объекта_массива> |
Анализирует элементы объекта массива. Параметр -start задает индекс, начиная с которого отображаются элементы. Параметр -length задает количество отображаемых элементов. Параметр -detail задает вывод сведений об элементе с использованием форматов DumpObj и DumpVC. Параметр -nofields отменяет отображение массивов. Этот параметр может использоваться только при наличии параметра -detail. |
DumpAssembly <адрес_сборки> |
Отображает информацию о сборке. Команда DumpAssembly выводит список модулей, если они существуют. Адрес сборки можно получить с помощью команды DumpDomain. |
DumpClass <адрес_EEClass> |
Отображает информацию о структуре EEClass, связанной с типом. Команда DumpClass выводит значения статических полей; значения нестатических полей не выводятся. Для получения адреса структуры EEClass можно использовать команду DumpMT, DumpObj, Name2EE или Token2EE. |
DumpDomain [<адрес_домена>] |
Перечисляет все объекты Assembly, загруженные по указанному адреса объекта AppDomain. При вызове без параметров команда DumpDomain выводит список всех объектов AppDomain в составе процесса. |
DumpHeap [-stat] [-min <размер>][-max <размер>] [-thinlock] [-mt <адрес_MethodTable>] [-type <частичное_имя_типа>][начало [конец]] |
Отображает информацию о куче сборщика мусора и статистику сбора мусора по объектам. В случае чрезмерной фрагментации кучи сборщика мусора команда DumpHeap выдает соответствующее предупреждение. Параметр -stat ограничивает выводимую информацию статистической сводкой. Параметр -min задает пропуск объектов, размер которых меньше значения параметра size, указанного в байтах. Параметр -max задает пропуск объектов, размер которых больше значения параметра size, указанного в байтах. Параметр -thinlock задает вывод сообщений о ThinLocks. Дополнительные сведения см. в описании команды SyncBlk. Параметр -mt задает вывод только тех объектов, которые соответствуют указанной структуре MethodTable. Параметр -type задает вывод только тех объектов, для которых имя типа содержит указанную строку. Параметр start задает составление списка начиная с указанного адреса. Параметр end прекращает составление списка на указанном адресе. |
DumpIL [<адрес_DynamicMethod>] [<адрес_DynamicMethodDesc>] [<адрес_MethodDesc>] |
Отображает промежуточный язык, связанный с управляемым методом. Следует иметь в виду, что динамический промежуточный язык генерируется иначе, чем промежуточный язык, загруженный из сборки. Динамический промежуточный язык относится к объектам внутри управляемого объекта-массива, а не к маркерам метаданных. |
DumpLog [<имя_файлаe>] |
Записывает в указанный файл содержимое журнала нагрузок, хранящегося в памяти. Если имя не указано, команда создает файл Stresslog.txt в текущем каталоге. Журнал нагрузок в памяти ведется в среде CLR для использования при диагностике сбоев, вызываемых нагрузкой. С помощью журнала можно диагностировать отказы, не используя блокировки или данные ввода-вывода. Чтобы разрешить ведение журнала нагрузок, установите следующие параметры реестра в разделе HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework: (DWORD) StressLog = 1 (DWORD) LogFacility = 0xffffffff (DWORD) StressLogSize = 65536 |
DumpMD <адрес_MethodDesc> |
Отображает информацию о структуре MethodDesc, находящейся по указанному адресу. Для получения адреса структуры MethodDesc из управляемой функции можно использовать команду IP2MD. |
DumpMT [-MD] <адрес_MethodTable> |
Отображает информацию о таблице методов, расположенной по указанному адресу. Параметр -MD задает вывод списка всех методов, определенных вместе с объектом. Каждый управляемый объект содержит указатель на таблицу методов. |
DumpMethodSig <подпись_метода> <адрес_модуляr> |
Отображает информацию о структуре MethodSig, находящейся по указанному адресу. |
DumpModule [-mt] <адрес_модуля> |
Отображает информацию о модуле, находящемся по указанному адресу. Параметр -mt задает вывод типов, определенных в модуле, и типов, на которые имеются ссылки в модуле. Для получения адреса модуля можно использовать команду DumpDomain или DumpAssembly. |
DumpObj <адрес_объекта> -или- DO <адрес_объекта> |
Отображает информацию об объекте, находящемся по указанному адресу. Команда DumpObj выводит список полей, сведения о структуре EEClass, таблицу методов и размер объекта. Для получения адреса объекта можно использовать команду DumpStackObjects. Следует иметь в виду, что команду DumpObj можно выполнять для полей типа CLASS, поскольку они также являются объектами. |
DumpRuntimeTypes |
Отображает типы среды выполнения в куче сборщика мусора и выводит список соответствующих имен типов и таблиц методов. |
DumpStack [-EE] [вершина_стека [дно_стекаk]] |
Отображает трассу стека. Параметр -EE команды DumpStack задает вывод только управляемых функций. Параметры top и bottomпозволяют ограничить состав отображаемых кадров стека на платформах x86. На платформах x86 команда DumpStack создает подробную трассу стека. На платформах x64 и IA-64 команда DumpStack действует аналогично команде отладчика K. На платформах x64 and IA-64 параметры top и bottomигнорируются. |
DumpSig <sigaddr> <moduleaddr> |
Отображает информацию о структуре Sig, находящейся по указанному адресу. |
DumpStackObjects [-verify] [вершина_стека [дно_стека]] -или- DSO [-verify] [вершина_стека [дно_стека]] |
Отображает все управляемые объекты, обнаруженные в пределах границ текущего стека. Параметр -verify задает проверку каждого нестатического поля CLASS в поле объекта. Для определения значений локальных переменных и параметров используйте команду DumpStackObject вместе с командами трассировки стека, такими как K и CLRStack. |
DumpVC <адрес_MethodTable> <адрес> |
Отображает информацию о полях класса значений, находящегося по указанному адресу. Параметр MethodTable позволяет команде DumpVC правильно интерпретировать поля. В классах значений первое поле не содержит таблицу методов. |
EEHeap [-gc] [-loader] |
Отображает информацию о памяти процессов, занимаемой внутренними структурами данных среды CLR. Параметры -gc и -loader ограничивают выходные данные этой команды только сведениями о структурах данных сборщика мусора и загрузчика. Информация о сборщике мусора включает диапазоны каждого сегмента в управляемой куче. Если указатель попадает в диапазон сегмента, заданный параметром EEHeap -gc, значит, он является указателем объекта. |
EEStack [-short] [-EE] |
Выполняет команду DumpStack для всех потоков в составе процесса. Параметр -EE передается непосредственно в команду DumpStack. Параметр -short ограничивает выходные данные следующими видами потоков:
|
EEVersion |
Отображает версию среды CLR. |
EHInfo [<адрес_MethodDesc>] [<адрес_кода>] |
Отображает блоки обработки исключений в указанном методе. Данная команда выводит адреса кода и смещения для блока предложений (блока try) и блока обработчика (блока catch). |
FinalizeQueue [-detail] |
Отображает все объекты, зарегистрированные для заключительной обработки. Параметр -detail задает вывод дополнительной информации о всех блоках SyncBlocks и оболочках RuntimeCallableWrappers, ожидающих очистки. Поток завершения кэширует и очищает структуры данных обоих типов. |
FindAppDomain <адрес_объекта> |
Определяет домен приложения для объекта, находящегося по указанному адресу. |
GCHandles [-perdomain] |
Отображает статистику дескрипторов сборщика мусора в составе процесса. Параметр -perdomain упорядочивает статистику по доменам приложений. Команда GCHandles служит для поиска утечек памяти, вызываемых утечками дескрипторов сборщика мусора. Например, утечка памяти происходит, когда в коде продолжает использоваться большой массив, поскольку на него еще указывает строгий дескриптор сборщика мусора, а сам дескриптор удаляется без освобождения памяти. |
GCHandleLeaks |
Ищет в памяти ссылки на строгие и закрепленные дескрипторы сборщика мусора в рамках процесса и выводит результаты. При обнаружении дескриптора команда GCHandleLeaks отображает адрес ссылки. Если дескриптор в памяти не найден, выдается уведомление. |
GCInfo <адрес_MethodDesc><адрес_кода> |
Отображает данные, показывающие, содержатся ли управляемые объекты в регистрах или ячейках стека. Если производится сбор мусора, сборщик должен знать расположение ссылок на объекты, чтобы их можно было обновить новыми значениями указателей объектов. |
GCRoot [-nostacks] <адрес_объекта> |
Отображает информацию о ссылках (или корнях) объекта, находящегося по указанному адресу. Команда GCRoot анализирует всю управляемую кучу и таблицу дескрипторов в поисках дескрипторов, находящихся в других объектах или в стеке. Затем каждый стек просматривается в поисках указателей на объекты; просматривается и очередь метода завершения. Данная команда не определяет, является ли корень стека допустимым или он удален. Используйте команды CLRStack и U, чтобы дизассемблировать кадр, к которому принадлежит локальное значение или значение аргумента, и определить, используется ли еще корень стека. Параметр -nostacks ограничивает поиск дескрипторами сборщика мусора и объектами freachable. |
help [<команда>] [<типичные_вопросы>] |
Отображает все доступные команды при отсутствии параметров или, если указана команда, подробные справочные сведения об этой команде. Параметр faq задает вывод ответов на часто задаваемые вопросы. |
IP2MD <адрес_кода> |
Отображает структуру MethodDesc по указанному адресу в коде после его JIT-компиляции. |
MinidumpMode [0] [1] |
Запрещает выполнение небезопасных команд при использовании минидампа. Значение 0 отключает этот режим, а значение 1 включает его. По умолчанию MinidumpMode имеет значение 0. Минидампы, созданные с помощью команды .dump /m или .dump, содержат ограниченный набор данных, связанных с CLR, и позволяют корректно выполнять лишь часть команд SOS. Выполнение некоторых команд может завершаться сбоем из-за непредвиденных ошибок, вызываемых тем, что требуемые области памяти не отображены или отображены лишь частично. Данный параметр блокирует запуск небезопасных команд для минидампов. |
Name2EE <имя_модуля> <имя_типа_или_метода> -или- Name2EE <имя_модуля>!<имя_типа_или_метода> |
Отображает структуру MethodTable и структуру EEClass для указанного типа или метода в указанном модуле. Указанный модуль должен быть загружен в рамках процесса. Для получения требуемого имени типа просмотрите модуль, используя Дизассемблер MSIL (Ildasm.exe). Можно также задать * в качестве имени модуля, чтобы просматривались все загруженные управляемые модули. Параметр имя_модуля может также содержать имя отладчика для модуля, такое как mscorlib или image00400000. Данная команда поддерживает следующий синтаксис отладчика Windows: <module>!<type>. Имя типа должно быть полным. |
ObjSize [<адрес_объекта>] |
Отображает размер указанного объекта. При отсутствии параметров команда ObjSize выводит размеры всех объектов, найденных в управляемых потоках, все дескрипторы сборщика мусора в данном процессе, а также общий размер всех объектов, указываемых этими дескрипторами. Команда ObjSize включает в размер каждого объекта размеры всех его дочерних объектов. |
PrintException [-nested] [<адрес_объекта_исключения>] -или- PE [-nested] [<адрес_объекта_исключения>] |
Отображает и форматирует поля всех производных объектов класса Exception, находящегося по указанному адресу. Если адрес не задан, команда PrintException отображает последнее исключение, возникшее в текущем потоке. Параметр -nested задает вывод сведений о вложенных объектах исключений. С помощью этой команды можно форматировать и просматривать поле _stackTrace, представляющее двоичный массив. |
ProcInfo [-env] [-time] [-mem] |
Отображает переменные среды для статистики процесса, процессорного времени ядра и использования памяти. |
RCWCleanupList <адрес_RCWCleanupList> |
Отображает список вызываемых оболочек времени выполнения по указанному адресу, ожидающих очистки. |
SaveModule <базовый_адрес> <имя_файла> |
Записывает в указанный файл образ, загруженный в память по указанному адресу. |
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, где указано последнее исключение, сгенерированное в потоке. Параметр -live задает вывод потоков, связанных с активным потоком. Параметр -special задает вывод всех специальных потоков, созданных средой CLR. К специальным потокам относятся потоки сборки мусора (для параллельной сборки мусора и серверной сборки мусора), вспомогательные потоки отладчика, потоки метода завершения, потоки выгрузки AppDomain и потоки таймера пула потоков. |
TraverseHeap [-xml] <имя_файла> |
Записывает данные кучи в указанный файл в формате, распознаваемом профилировщиком CLR. Параметр -xml предписывает команде TraverseHeap преобразовать файл в формат XML. Профилировщик CLR можно загрузить из Центра загрузки Майкрософт. |
U [-gcinfo] [-ehinfo] <адрес_MethodDesc> | <адрес_кода> |
Отображает дизассемблированный код с примечаниями для управляемого метода, заданного указателем структуры MethodDesc или адресом кода внутри тела метода. Команда U отображает весь метод от начала до конца, с примечаниями, преобразующими маркеры метаданных в имена. Параметр -gcinfo предписывает команде U вывести содержимое структуры GCInfo для данного метода. Параметр -ehinfo задает вывод сведений об исключениях в методе. Эту информацию можно также получить с помощью команды EHInfo. |
VerifyHeap |
Проверяет кучу сборщика мусора на наличие признаков повреждения и отображает обнаруженные ошибки. Повреждения кучи могут быть вызваны неправильно определенными вызовами неуправляемого кода. |
VMMap |
Выполняет обход виртуального адресного пространства и отображает тип защиты для каждого региона. |
VMStat |
Создает сводное представление виртуального адресного пространства, упорядоченное по типам защиты соответствующих видов памяти (свободная, зарезервированная, выделенная, закрытая, отображаемая, образ). В столбце TOTAL содержится результат умножения значения столбца AVERAGE на значение столбца BLK COUNT. |
Заметки
Для работы с расширением отладки SOS его следует загрузить в отладчик WinDbg.exe, доступный на веб-узле Средства отладки для Windows, или в Visual Studio 2005 (либо более раннюю версию). Команды можно выполнять в среде WinDgb.exe или в окне интерпретации Visual Studio.
Расширение отладки SOS позволяет просматривать информацию о коде, выполняемом в общеязыковой среде выполнения. Например, с помощью расширения отладки SOS можно получать сведения об управляемой куче, искать повреждения кучи, отображать внутренние типы данных, используемые средой выполнения, и просматривать информацию о любом управляемом коде, запущенном в среде выполнения.
Загрузка расширения отладки SOS
Чтобы загрузить расширение отладки SOS в отладчик WinDbg.exe, выполните в отладчике показанную ниже команду; чтобы загрузить расширение отладки SOS в Visual Studio, выполните эту команду в окне интерпретации во время отладки:
.loadby sos mscorwks
Перед загрузкой расширения отладки SOS необходимо включить отладку неуправляемого кода в настройках проекта решения. В некоторых языковых версиях отладка неуправляемого кода по умолчанию отключается.
Примечание. Чтобы открыть окно интерпретации в Visual Studio 2005, откройте меню Отладка, откройте меню Окна и выберите пункт Интерпретация. Окно интерпретации 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