Отладка управляемого кода с помощью отладчика 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 или .NET 5+ и более поздних версий среда выполнения .
coreclr.dll
Для получения дополнительной информации см. Common Language Runtime. - Расширение отладки SOS для .NET Core
Для .NET Core доступен инструмент cli dotnet для установки sos.dll. Дополнительные сведения см. в разделе установщика SOS (dotnet-sos).
Исходный платформа .NET Framework.
- Для исходного платформа .NET Framework
clr.dll
используется среда выполнения. - Расширение отладки SOS (sos.dll)
Получение расширения отладки 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).