Поделиться через


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

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

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

В этой статье приведены инструкции по использованию отладчиков Windows (WinDbg, CDB, NTSD) для отладки управляемого кода, включая платформа .NET Framework, .NET Core и приложения .NET 5+.

Примечание.

При отладке платформа .NET Framework, .NET Core и .NET 5+ приложений убедитесь, что вы используете последнюю версию средств отладчика Windows. Кроме того, рекомендуется использовать Visual Studio или Visual Studio Code для более интегрированной отладки. WinDbg является более сложным, требует больше работы для настройки и обычно используется при необходимости дополнительных сведений о низком уровне.

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

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

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

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

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

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

Отладка управляемого кода с помощью ! Расширение отладки SOS, отладчик должен загружать различные компоненты. Тем! Расширение отладки SOS и необходимые компоненты, используемые для разных компонентов для .NET Core и исходной платформа .NET Framework. Для любого из этих компонентов используется компонент доступа к данным (DAC) (mscordacwks.dll).

Пакет SDK для .NET предоставляет средства, которые могут быть полезны при отладке приложений .NET. Дополнительные сведения см. в разделе "Что такое пакет SDK для .NET?".

.NET Core

Для .NET Core доступен инструмент cli dotnet для установки sos.dll. Дополнительные сведения см. в разделе установщика SOS (dotnet-sos).

Исходный платформа .NET Framework.

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

Файлы расширения отладки SOS (sos.dll) не включены во все версии средств отладки для Windows. Если sos.dll недоступна, см . статью об установке SOS в Windows.

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

Для отладки приложений .NET Core и .NET 5+ необходимо загрузить соответствующую версию расширения отладки SOS.

Например, для версии ! SOS, включенный в отладчик и включенный в текущий путь поиска расширений, будет использоваться команда .load.

0:000> .load sos.dll

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

...
Extension DLL chain:
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\SOS.dll: image 4.8.9275.0, API 1.0.0, built Wed Aug 28 14:43:27 2024
        [path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\SOS.dll]
    C:\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App\8.0.8\coreclr.dll: image 8,0,824,36612 @Commit: 08338fcaa5c9b9a8190abb99222fed12aaba956c, built Tue Jul 16 11:10:19 2024
        [path: C:\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App\8.0.8\coreclr.dll]

Если версия отладчика не включает sos.dll, может потребоваться указать полный путь к файлу SOS.dll. Как правило, файл SOS.dll можно найти в каталоге среды выполнения установки .NET Core или платформа .NET Framework.

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

Загрузка определенной версии sos.dll

Загрузка sos.dll может быть сложной, так как существует зависимость от дополнительных библиотек DLL, которые используются sos.dll для взаимодействия с .NET. Кроме того, требуемая версия DLL зависит от версии .NET от отладчика приложения, а на компьютере может присутствовать несколько версий .NET.

Одна из стратегий загрузки правильной версии зависимой библиотеки DLL заключается в том, чтобы отладчик прервался при возникновении первого уведомления clr .NET (CLRN) с помощью sx, sxd, sxe, sxi, sxn, sxr, sxr( set Exceptions)[.. /debuggercmds/sx--sxd--sxe--sxi--sxn--sxr--sx---set-exceptions-.md] . После подключения к целевому приложению .NET эта команда будет использоваться после первого перерыва.

0:000> sxe CLRN

Следующее возобновление выполнения и ожидание прерывания.

0:000> g

Когда происходит разрыв, отключите разрыв уведомлений clr, как мы знаем, clr.dll (или coreclr.dll) был загружен.

0:000> sxd CLRN

С отладчиком в этом контексте используйте loadby для загрузки !sos из того же расположения каталога "поблизости".

0:000> .loadby sos clr

Другим вариантом является использование cordll (Отладка CLR) для загрузки библиотек DLL отладки СРЕДЫ CLR , предоставив путь к расположению целевой платформы.

0:000> .cordll -ve -u -lp C:\Windows\Microsoft.NET\Framework\v4.0.30319\
CLRDLL: Loaded DLL C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscordacwks.dll
Automatically loaded SOS Extension
CLR DLL status: Loaded DLL C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscordacwks.dll

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

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

0:000> .chain
Extension DLL search Path:
    C:\Program Files\Debugging Tools for Windows (x64);...
Extension DLL chain:
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\SOS.dll: image 4.8.9275.0, API 1.0.0, built Wed Aug 28 14:43:27 2024
        [path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\SOS.dll]
...

Файлы символов .NET

Файлы символов необходимы для отладки. Для платформа .NET Framework приложений .NET Core и .NET 5+ можно получить необходимые файлы символов с общедоступного сервера символов Майкрософт. Используйте следующую команду, чтобы задать путь символа и загрузку символов эхо.

.symfix

!sym noisy

.reload

Тестирование расширения .NET Core !sos

Чтобы проверить расширение отладки SOS, введите !sos.help.

0:000> !sos.help
-------------------------------------------------------------------------------
SOS is a debugger extension DLL designed to aid in the debugging of managed
programs. Functions are listed by category, then roughly in order of
importance. Shortcut names for popular functions are listed in parenthesis.
Type "!help <functionname>" for detailed info on that function. 

Object Inspection                  Examining code and stacks
-----------------------------      -----------------------------
DumpObj (do)                       Threads
DumpArray (da)                     ThreadState
DumpStackObjects (dso)             IP2MD
DumpHeap                           U
DumpVC                             DumpStack
GCRoot                             EEStack
ObjSize                            CLRStack
FinalizeQueue                      GCInfo
PrintException (pe)                EHInfo
TraverseHeap                       BPMD 
                                   COMState

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

0:000> !sos.DumpDomain
--------------------------------------
System Domain:      7565d980
LowFrequencyHeap:   7565dca4
HighFrequencyHeap:  7565dcf0
StubHeap:           7565dd3c
Stage:              OPEN
Name:               None
--------------------------------------
Shared Domain:      7565d620
LowFrequencyHeap:   7565dca4
HighFrequencyHeap:  7565dcf0
StubHeap:           7565dd3c
Stage:              OPEN
Name:               None
Assembly:           00fa5e78 [C:\WINDOWS\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll]
ClassLoader:        00fa5f40
  Module Name
73571000    C:\WINDOWS\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll

0:000> !sos.Threads
ThreadCount:      2
UnstartedThread:  0
BackgroundThread: 2
PendingThread:    0
DeadThread:       0
Hosted Runtime:   no
                                                                         Lock  
       ID OSID ThreadOBJ    State GC Mode     GC Alloc Context  Domain   Count Apt Exception
   0    1 4538 00f91110     20220 Preemptive  02FE1238:00000000 00f58be0 1     Ukn 
   7    2 250c 00f9da88     21220 Cooperative 00000000:00000000 00f58be0 1     Ukn (Finalizer) 

Тестирование расширения платформа .NET Framework !sos

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

0:030> !soshelp
crashinfo                                 Displays the crash details that created the dump.
help, soshelp <command>                   Displays help for a command.
loadsymbols <url>                         Loads symbols for all modules.
logclose <path>                           Disables console file logging.
logging <path>                            Enables/disables internal diagnostic logging.
logopen <path>                            Enables console file logging.
maddress                                  Displays a breakdown of the virtual address space.
modules, lm                               Displays the native modules in the process.
registers, r                              Displays the thread's registers.
runtimes <id>                             Lists the runtimes in the target or changes the default runtime.
setclrpath <path>                         Sets the path to load coreclr DAC/DBI files.
setsymbolserver, SetSymbolServer <url>    Enables and sets symbol server support for symbols and module download.
sosflush                                  Resets the internal cached state.
sosstatus                                 Displays internal status.
threads, setthread <thread>               Lists the threads in the target or sets the current thread.

Примечания.

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