Depuración de código administrado mediante el depurador de Windows
Puede usar los depuradores de Windows (WinDbg, CDB y NTSD) para depurar aplicaciones de destino que contienen código administrado. Para depurar código administrado, use la extensión de depuración !SOS (sos.dll) y un componente de acceso a datos (mscordacwks.dll) en combinación con el entorno de ejecución de CLR.
Los depuradores de Windows, como WinDbg, son independientes del depurador de Visual Studio. Para obtener información sobre la distinción entre los depuradores de Windows y el depurador de Visual Studio, consulte Herramientas de depuración para Windows.
En este artículo se proporcionan instrucciones sobre el uso de depuradores de Windows (WinDbg, CDB, NTSD) para depurar código administrado, incluidas las aplicaciones de .NET Framework, .NET Core y .NET 5+.
Nota:
Al depurar aplicaciones de .NET Framework, .NET Core y .NET 5+, asegúrese de que usa la versión más reciente de las herramientas del depurador de Windows. Además, considere la posibilidad de usar Visual Studio o Visual Studio Code para obtener una experiencia de depuración más integrada. WinDbg es más complejo, tarda más trabajo en configurarse y se usa normalmente cuando se requiere información adicional de bajo nivel.
Introducción al código administrado
El código administrado se ejecuta junto con Common Language Runtime (CLR) de Microsoft .NET. En una aplicación de código administrado, el código binario que genera el compilador está en lenguaje intermedio de Microsoft (MSIL), que es independiente de la plataforma.
Cuando se ejecuta código administrado, el entorno de ejecución genera código nativo específico de la plataforma. El proceso de generación de código nativo a partir de MSIL se denomina compilación Just-In-Time (JIT). Después de que el compilador JIT haya compilado el MSIL para un método específico, el código nativo del método permanece en memoria. Siempre que se llame a este método más adelante, el código nativo se ejecuta y el compilador JIT no tiene que estar implicado.
Puede compilar código administrado mediante varios compiladores fabricados por diversos productores de software. En concreto, Microsoft Visual Studio puede compilar código administrado a partir de varios lenguajes diferentes, como C#, Visual Basic, JScript y C++ con extensiones administradas.
El CLR no se actualiza cada vez que se actualiza .NET Framework. Por ejemplo, las versiones 2.0, 3.0 y 3.5 de .NET Framework usan la versión 2.0 de CLR. Para obtener más información sobre las versiones de .NET, consulte Versiones y dependencias de .NET Framework. Para obtener información sobre cómo determinar la versión de .NET en el equipo, consulte Determinación de qué versiones de .NET Framework están instaladas.
Depurar código administrado
Para depurar código administrado mediante la extensión de depuración !SOS, el depurador debe cargar varios componentes. La extensión de depuración !SOS y los componentes necesarios que se usan para diferentes para .NET Core y .NET Framework original. Para cualquiera de ellos, se usa el componente de acceso a datos (DAC) (mscordacwks.dll).
El SDK de .NET proporciona herramientas que pueden resultar útiles para trabajar con aplicaciones .NET de depuración. Para obtener más información, consulte ¿Qué es el SDK de .NET?
.NET Core
- Para .NET Core o .NET 5+ y versiones posteriores, el entorno de ejecución es
coreclr.dll
. Para obtener más información, vea Información general de Common Language Runtime (CLR). - Extensión de depuración SOS de .NET Core
Para .NET Core hay una herramienta de la CLI dotnet disponible para instalar sos.dll. Para obtener más información, consulte Instalador de SOS (dotnet-sos).
.NET Framework original.
- Para .NET Framework original,
clr.dll
es el entorno de ejecución. - Extensión de depuración SOS (sos.dll)
Obtención de la extensión de depuración SOS (sos.dll)
Los archivos de extensión de depuración SOS (sos.dll) no se incluyen en todas las versiones de las herramientas de depuración para Windows. Si sos.dll no está disponible, consulte Instalación de SOS en Windows.
Carga de la extensión de depuración SOS (sos.dll)
Para depurar aplicaciones de .NET Core y .NET 5+, debe cargar la versión adecuada de la extensión de depuración SOS.
Por ejemplo, en una versión de !SOS que se incluye con el depurador y se incluye en la ruta de búsqueda de extensión actual, se usaría el comando .load.
0:000> .load sos.dll
Para comprobar que la extensión de depuración de SOS se ha cargado correctamente, use el comando .chain y examine la cadena DLL de extensión.
...
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]
Si la versión del depurador no incluye el sos.dll, es posible que tenga que especificar la ruta completa al archivo SOS.dll. Normalmente, puede encontrar el archivo SOS.dll en el directorio del entorno de ejecución de la instalación de .NET Core o .NET Framework.
0:000> .load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll
Carga de una versión específica de sos.dll
Cargar el sos.dll puede ser complejo, ya que hay una dependencia de los archivos DLL adicionales que usa el sos.dll para comunicarse con .NET. Además, la versión de DLL necesaria depende de la versión de .NET de la aplicación que se está depurando y puede haber varias versiones de .NET en el equipo.
Una estrategia para cargar la versión correcta del DLL dependiente es pedir al depurador que interrumpa cuando se produzca la primera notificación clr de .NET (CLRN) mediante el comando sx, sxd, sxe, sxi, sxn, sxr, sx- (Set Exceptions)[../debuggercmds/sx--sxd--sxe--sxi--sxn--sxr--sx---set-exceptions-.md]. Una vez que se haya asociado a la aplicación .NET de destino, este comando se usaría después de la primera interrupción.
0:000> sxe CLRN
A continuación, reanude la ejecución y espere a que se produzca la interrupción.
0:000> g
Cuando se produce la interrupción, deshabilite el salto de notificación clr, ya que sabemos que clr.dll (o coreclr.dll) se cargó.
0:000> sxd CLRN
Con el depurador en este contexto, use .loadby para cargar el !sos desde la misma ubicación de directorio "cercana".
0:000> .loadby sos clr
Otra opción es usar el .cordll (depuración de CLR de control) para cargar los DLL de depuración de CLR proporcionando una ruta a la ubicación del marco de destino.
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
Uso de la extensión de depuración SOS
Para comprobar que la extensión de depuración SOS se cargó correctamente, escriba el comando .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]
...
Archivos de símbolos de .NET
Los archivos de símbolos son esenciales para la depuración. En el caso de las aplicaciones de .NET Framework, .NET Core y .NET 5+, puede recuperar los archivos de símbolos necesarios del servidor de símbolos público de Microsoft. Use el siguiente comando para establecer la ruta del símbolo y la carga de símbolos de eco.
.symfix
!sym noisy
.reload
Prueba de la extensión !sos de .NET Core
Para probar la extensión de depuración SOS, escriba !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
A continuación, pruebe uno de los comandos proporcionados por la extensión de depuración SOS. Por ejemplo, podría probar el comando !sos.DumpDomain o !sos.Threads proporcionado por la extensión de depuración SOS de .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)
Prueba de la extensión !sos de .NET Framework
Para probar la extensión de depuración SOS, escriba !sos.help. A continuación, pruebe uno de los comandos proporcionados por la extensión de depuración SOS. Por ejemplo, podría probar el comando !sos.sostatus o !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.
Notas
A veces, una aplicación de código administrado carga más de una versión de CLR. En ese caso, debe especificar la versión de DAC que se va a cargar. Para obtener más información, consulte .cordll y Clrver.exe (herramienta de versión de CLR).