No se puede cargar SOS en WinDbg

132

Antecedentes: soy nuevo en WinDbg y trato de hacerlo funcionar por primera vez. Quiero examinar un volcado de memoria que tomé de un sitio ASP.NET 4 en ejecución alojado en IIS 7 en Windows Server 2008 (x86) y lo descargué a mi máquina local.

Instalé las herramientas de depuración y lancé WinDbg por primera vez, abriendo el volcado de memoria. Fui a Archivo | Ruta del archivo de símbolos y establecer la ruta *srv*c:\symbols*http://msdl.microsoft.com/download/symbols*y esperar a que se carguen todos los símbolos.

Al intentar cargar SOS, me encontré con problemas. Primero, probé el siguiente comando ...

.loadby sos mscorwks

... y recibió la respuesta Unable to find module 'mscorwks'.

Después de recorrer la web, intenté cargar mscorwks ejecutando el siguiente comando ...

sxe ld mscorwks.dll
g

... y recibí la respuesta "No hay errores de depuradores ejecutables en 'g'"

Copié SOS.dll (de C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319) en el directorio WinDbg, luego intenté ...

.load sos

... y recibí el error ...

The call to LoadLibrary(sos) failed, Win32 error 0n193
    "%1 is not a valid Win32 application."
Please check your debugger configuration and/or network access.

No estoy muy seguro de cómo proceder. Solo quiero cargar SOS y buscar en este archivo de volcado. Cualquier ayuda sería muy apreciada.

Fyi ... Estoy tratando de abrir el archivo de volcado en una versión de 64 bits de Windows 7 con la versión de 64 bits de Windbg.

Kevin Babcock
fuente

Respuestas:

203

El dll de tiempo de ejecución CLR cambió su nombre a clr.dll.NET 4. Por lo tanto, para cargar la versión correcta de SOS, debe ajustar su .loadbycomando. Es decir

.loadby sos clr

Además, si tiene 64 bits, también debe instalar la versión de 32 bits de Debugging Tools para Windows para depurar aplicaciones de 32 bits. Se instalan lado a lado, por lo que no hay problema en tener la versión de 32 bits y la de 64 bits en la misma máquina.

Yo recomendaría no copiar SOS.dll. SOS debe coincidir con la versión exacta del marco, por lo que siempre que lo cargue desde el directorio del marco utilizando .loadby, ya está todo listo.

Brian Rasmussen
fuente
Me resulta difícil obtener ambos en mi sistema, ya que los últimos instaladores detectan automáticamente el tipo de CPU. ¿Hay una bandera de anulación que conoces para el msi? Voy a instalar una versión antigua de 32 bits de WinDbg, pero no sé qué esperar.
Dave
55
@Dave: Quizás sea demasiado tarde, pero según la página web de instalación que se encuentra aquí: msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx puede seleccionar instalar los paquetes redistribuibles que colocan MSI para cada versión de arquitectura aquí : C: \ Archivos de programa \ Microsoft SDKs \ Windows \ v7.1 \ Redist \ Debugging Tools para Windows
Aaron Lerch
Si digo .loadby sos clrque entiendo Unable to find module 'clr'. Estoy tratando de depurar .NET 4 con x64 WinDbg
Csaba Toth
2
@CsabaToth ¿Es un tugurio o estás haciendo depuración en vivo? Si está realizando una depuración en vivo, es posible que CLR aún no se haya cargado. Puede hacer sxe ld clrque pare cuando se ha cargado el CLR y luego puede cargar SOS en ese punto.
Brian Rasmussen
@BrianRasmussen Es un ejecutable compilado. Si eche un vistazo a la ventana Módulos, clr cargada.
Csaba Toth
18

El comando WinDbg 'g' significa [Continuar]

Como está abriendo un archivo de volcado, no hay forma de 'continuar', solo contiene la memoria del proceso.

Por lo tanto, el mensaje "No hay errores de depuración ejecutables en 'g'" es lógico en su caso ya que el proceso no se está ejecutando .

Con respecto a la carga de la versión correcta de SOS, use el siguiente comando según la versión de .NET.

.NET 4 y superior .loadby sos

.NET 3.5 y 2 .loadby sos mscorwks

.NET 1.0 y 1.1 .load clr10 \ sos

HerbalMart
fuente
1

Las respuestas anteriores necesitan mejoras, ya que con el tiempo las cosas han sido más fáciles de manejar.

JOHN ROBBINS tiene un buen artículo al respecto, vea que los servidores de símbolos de Microsoft están configurados en la ruta del archivo de símbolos y se ejecutan! Para verificar, ejecute .chain en el indicador y verá el dll cargado.

Kiran Prabhu
fuente