Отладка управляемого кода с помощью отладчика Windows

Отладчики Windows (WinDbg, CDB и NTSD) можно использовать для отладки целевых приложений, содержащих управляемый код. Для отладки управляемого кода необходимо загрузить расширение отладки SOS (sos.dll) и компонент доступа к данным (mscordacwks.dll).

Отладчики Windows отделены от отладчика Visual Studio. Сведения о различиях между отладчиками Windows и отладчиком Visual Studio см. в разделе Отладка Windows.

Общие сведения об управляемом коде

Управляемый код выполняется вместе с средой CLR Microsoft .NET. В приложении с управляемым кодом двоичный код, создаваемый компилятором, находится на языке MSIL, который не зависит от платформы.

При выполнении управляемого кода среда выполнения создает машинный код, зависящий от платформы. Процесс создания машинного кода из MSIL называется JIT-компиляцией. После того как JIT-компилятор скомпилировал MSIL для определенного метода, машинный код метода остается в памяти. При последующем вызове этого метода выполняется машинный код, и JIT-компилятор не требуется.

Вы можете создавать управляемый код с помощью нескольких компиляторов, которые производятся различными производителями программного обеспечения. В частности, Microsoft Visual Studio может создавать управляемый код на нескольких языках, включая C#, Visual Basic, JScript и C++ с управляемыми расширениями.

Среда CLR не обновляется при каждом обновлении платформа .NET Framework. Например, версии 2.0, 3.0 и 3.5 платформа .NET Framework используют версию 2.0 среды CLR. В следующей таблице показаны версия и имя файла среды CLR, используемой каждой версией платформа .NET Framework.

Версия платформы .NET Framework Версия среды CLR Имя файла CLR
1.1 1,1 mscorwks.dll
2.0 2.0 mscorwks.dll
3,0 2,0 mscorwks.dll
3,5 2,0 mscorwks.dll
4,0 4,0 clr.dll
4.5. 4,0 clr.dll

Отладка управляемого кода

Для отладки управляемого кода отладчик должен загрузить эти два компонента.

Примечание Для всех версий платформа .NET Framework имя файла приложения уровня данных mscordacwks.dll, а имя файла расширения отладки SOS — sos.dll.

Получение расширения отладки SOS (sos.dll)

Файлы расширения отладки SOS (sos.dll) не включены в текущую версию средств отладки для Windows.

Для платформа .NET Framework версий 2.0 и более поздних sos.dll включены в установку платформа .NET Framework.

Для версии 1. x платформа .NET Framework, sos.dll не включен в установку платформа .NET Framework. Получение sos.dll для платформа .NET Framework 1.x, скачайте 32-разрядную версию Средств отладки Windows 7 для Windows.

Средства отладки Windows 7 для Windows включены в windows SDK для Windows 7, который доступен в следующих двух местах:

Если вы используете 64-разрядную версию Windows, используйте ISO, чтобы можно было указать 32-разрядную версию пакета SDK. Sos.dll входит только в 32-разрядную версию Средств отладки Windows 7 для Windows.

Загрузка mscordacwks.dll и sos.dll (динамическая отладка)

Предположим, что отладчик и отлаживаемое приложение работают на одном компьютере. Затем платформа .NET Framework, используемый приложением, устанавливается на компьютере и становится доступным отладчику.

Отладчик должен загрузить версию приложения уровня данных, которая совпадает с версией среды CLR, используемой приложением с управляемым кодом. Разрядность (32-разрядная или 64-разрядная) также должна совпадать. Приложение уровня данных (mscordacwks.dll) поставляется с платформа .NET Framework. Чтобы загрузить правильную версию приложения уровня данных, подключите отладчик к приложению с управляемым кодом и введите следующую команду.

.cordll -ve -u -l

Выходные данные должны выглядеть примерно так.

CLRDLL: Loaded DLL C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscordacwks.dll
CLR DLL status: Loaded DLL C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscordacwks.dll

Чтобы убедиться, что версия mscordacwks.dll соответствует версии среды CLR, используемой приложением, введите одну из следующих команд для отображения сведений о загруженном модуле CLR.

lmv mclr (для среды CLR версии 4.0)

lmv mscorwks (для версии 1.0 или 2.0 среды CLR)

Выходные данные должны выглядеть примерно так.

start             end                 module name
000007ff`26710000 000007ff`2706e000   clr        (deferred)             
    Image path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
...

Обратите внимание, что в предыдущем примере версия среды CLR (clr.dll) соответствует версии приложения уровня данных (mscordacwks.dll): v4.0.30319. Также обратите внимание, что оба компонента являются 64-разрядными.

При использовании CORDLL для загрузки приложения уровня данных расширение отладки SOS (sos.dll) может загружаться автоматически. Если sos.dll не загружается автоматически, можно использовать одну из этих команд, чтобы загрузить ее.

.loadby sos clr (для среды CLR версии 4.0)

.loadby sos mscorwks (для версии 1.0 или 2.0 среды CLR)

В качестве альтернативы использованию .loadby можно использовать .load. Например, чтобы загрузить версию 4.0 64-разрядной среды CLR, можно ввести команду, аналогичную этой.

.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll

В предыдущих выходных данных обратите внимание, что версия расширения отладки SOS (sos.dll) соответствует версии среды CLR и DAC: v4.0.30319. Также обратите внимание, что все три компонента являются 64-разрядными.

Загрузка mscordacwks.dll и sos.dll (файл дампа)

Предположим, что вы используете отладчик для открытия файла дампа (приложения с управляемым кодом), созданного на другом компьютере.

Отладчик должен загрузить версию приложения уровня данных, которая совпадает с версией среды CLR, используемой приложением с управляемым кодом на другом компьютере. Разрядность (32-разрядная или 64-разрядная) также должна совпадать.

Приложение уровня данных (mscordacwks.dll) поставляется с платформа .NET Framework, но предположим, что на компьютере с отладчиком не установлена правильная версия платформа .NET Framework. У вас есть три варианта.

  • Загрузите приложение уровня данных с сервера символов. Например, вы можете включить общедоступный сервер символов Майкрософт в путь к символам.
  • Установите правильную версию платформа .NET Framework на компьютере с отладчиком.
  • Получите правильную версию mscordacwks.dll от пользователя, создавшего файл дампа (на другом компьютере), и вручную скопируйте его на компьютер с отладчиком.

Здесь мы иллюстрируем использование общедоступного сервера символов Майкрософт.

Введите эти команды.

.sympath+ srv\* (добавление сервера символов в путь к символам).)

!sym шумно

.cordll -ve -u -l

Выходные данные будут выглядеть примерно так.

CLRDLL: Unable to get version info for 'C:\Windows\Microsoft.NET
   \Framework64\v4.0.30319\mscordacwks.dll', Win32 error 0n87

SYMSRV:  C:\ProgramData\dbg\sym\mscordacwks_AMD64_AMD64_4.0.30319.18010.dll
   \5038768C95e000\mscordacwks_AMD64_AMD64_4.0.30319.18010.dll not found

SYMSRV:  mscordacwks_AMD64_AMD64_4.0.30319.18010.dll from 
   https://msdl.microsoft.com/download/symbols: 570542 bytes - copied         
...
SYMSRV:  C:\ProgramData\dbg\sym\SOS_AMD64_AMD64_4.0.30319.18010.dll
   \5038768C95e000\SOS_AMD64_AMD64_4.0.30319.18010.dll not found

SYMSRV:  SOS_AMD64_AMD64_4.0.30319.18010.dll from 
   https://msdl.microsoft.com/download/symbols: 297048 bytes - copied         
...
Automatically loaded SOS Extension
...

В предыдущих выходных данных видно, что отладчик сначала искал mscordacwks.dll и sos.dll на локальном компьютере в папке C:\Windows\Microsoft.NET и в кэше символов (C:\ProgramData\dbg\sym). Если отладчик не нашел правильные версии файлов на локальном компьютере, он извлек их с сервера открытых символов.

Чтобы убедиться, что версия mscordacwks.dll соответствует версии среды CLR, используемой приложением, введите одну из следующих команд для отображения сведений о загруженном модуле CLR.

lmv -mclr (для среды CLR версии 4.0)

lmv -mscorwks (для среды CLR версии 1.0 или 2.0)

Выходные данные должны выглядеть примерно так.

start             end                 module name
000007ff`26710000 000007ff`2706e000   clr        (deferred)             
    Image path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
...

В предыдущем примере обратите внимание, что версия среды CLR (clr.dll) соответствует версии продукта приложения уровня данных (mscordacwks.dll): v4.0.30319. Также обратите внимание, что оба компонента являются 64-разрядными.

Использование расширения отладки SOS

Чтобы убедиться, что расширение отладки SOS загружено правильно, введите команду .chain .

0:000> .chain
Extension DLL search Path:
...
Extension DLL chain:
    C:\ProgramData\dbg\sym\SOS_AMD64_AMD64_4.0.30319.18010.dll\...
        ...
    dbghelp: image 6.13.0014.1665, API 6.2.6, built Wed Dec 12 03:02:43 2012
...

Чтобы протестировать расширение отладки SOS, введите !sos.help. Затем попробуйте выполнить одну из команд, предоставляемых расширением отладки SOS. Например, можно попробовать !sos. DumpDomain или !sos. Команда Threads .

Примечания

Иногда приложение с управляемым кодом загружает более одной версии среды CLR. В этом случае необходимо указать версию приложения уровня данных для загрузки. Дополнительные сведения см. в разделе CORDLL.