.net debugging windbg sos minidump

.net - ¿Qué hacer con "La versión de SOS no coincide con la versión de CLR que está depurando" en WinDbg?



debugging minidump (6)

Tengo un problema con algunas de mis aplicaciones. Es una aplicación basada en wcf que se ejecuta bajo IIS6 en Windows 2003 Server (x86):
En el Registro de eventos obtengo un error de la fuente "W3SVC-WP" (EventID = 2262):

ISAPI ''C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/aspnet_isapi.dll'' reported itself as unhealthy for the following reason: ''Deadlock detected''.

Estoy intentando descubrir qué está pasando. He configurado la creación de volcado para el Proceso del trabajador huérfano como se describe en esta KB . Cuando se produce un punto muerto, se crea un minivolcado.
Luego tomo este minivolcado para tratar de entender lo que sucedió. Aquí estoy, estoy atascado.

Ejecuto WinDbg x86, abro mi volcado y luego:

0:037> .loadby sos clr 0:037> .sympath SRV*c:/temp/symbols*http://msdl.microsoft.com/download/symbols Symbol search path is: SRV*c:/temp/symbols*http://msdl.microsoft.com/download/symbols Expanded Symbol search path is: srv*c:/temp/symbols*http://msdl.microsoft.com/download/symbols 0:037> !clrstack The version of SOS does not match the version of CLR you are debugging. Please load the matching version of SOS for the version of CLR you are debugging. CLR Version: 4.0.30319.1 SOS Version: 4.0.30319.235 CLRDLL: C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/mscordacwks.dll:4.0.30319.235 f:8 doesn''t match desired version 4.0.30319.01 f:8 CLRDLL: Loaded DLL c:/temp/symbols/mscordacwks_x86_x86_4.0.30319.01.dll/4BA1D9EF66f000/mscordacwks_x86_x86_4.0.30319.01.dll OS Thread Id: 0x690 (37) Unable to walk the managed stack. The current thread is likely not a managed thread. You can run !threads to get a list of managed threads in the process

¿Qué hacer con este error - "La versión de SOS no coincide con la versión de CLR que está depurando"?

El mismo error ("La versión de SOS no coincide con la versión de CLR que está depurando") me aparece cuando abro el minivolcado en VS2010.

He leído esta publicación - http://tech-thinker.com/Forums/tabid/62/forumid/12/postid/471/scope/posts/Default.aspx , e intenté instalar KB2518870 . No ayuda.


El problema central generalmente se encuentra en una versión no coincidente de mscordacwks.dll ( mscorwks.dll sí mismo no debería ser necesario si se realizó un volcado completo). En teoría, debería ser posible desde el servidor de símbolos: simplemente ejecute .cordll -ve -u -l . Para obtener más información sobre mscordacwks.dll consulte blogs.msdn.com/b/dougste/archive/2009/02/18/… .

Lamentablemente, algunas versiones de mscordacwks.dll no se han indexado, lo que significa que lo anterior no siempre funcionará. En tales casos, podría intentar obtener la versión correcta de la máquina en la que se realizó el volcado, como mencionaron Yocahi y Thomas (por ejemplo, desde C:/Windows/Microsoft.NET/Framework64/v4.0.30319 ). Una vez que lo obtenga, emita el siguiente comando para cargarlo: .cordll -u -ve -lp PathToFolderContainingMscorDAC . Por supuesto, esa máquina puede ser inaccesible, o puede haber sido reparada desde el momento en que se tomó el volcado.

Afortunadamente, hay una forma de extraer mscorwdacwks.dll del paquete actual de la actualización KB (reside en uno de los archivos cab dentro del ejecutable autoextraíble, use una herramienta como 7-Zip para extraerlo). También existen repositorios de actualizaciones .NET (cortesía del empleado de MS Doug Stewart), por lo que puede buscarlos para obtener el número exacto de compilación que necesita:

Una vez que tenga el mscordacwks.dll correcto, la advertencia SOS.dll podría ignorarse en la mayoría de los casos, ya que la versión más reciente de SOS.dll funcionaría la mayor parte del tiempo a pesar de la advertencia. Sin embargo, en algunos casos, SOS.dll se necesita la versión correcta de SOS.dll (y como SOS.dll adicional, se deshace de las molestas advertencias). Dunken vincula a una publicación de blog que debería ser útil en ese sentido (básicamente debe colocar el servidor de símbolos en la variable de entorno _NT_SYMBOL_PATH y ejecutar !analyze –v SOS.dll !analyze –v sin cargar SOS.dll primero - cargará la versión correcta). Si eso no funciona, podría intentar extraer SOS.dll de uno de los paquetes de actualización como se describió anteriormente. Este sitio puede resultar más fácil de usar para ese fin, ya que indexa específicamente las versiones de SOS.dll .

Finalmente, considere PsscorR2 (para .NET 2.0-3.5) y Psscor4 (para .NET 4.0). Psscor es un superconjunto de SOS.dll que no se queja de versiones no coincidentes, siempre y cuando esté utilizando la versión principal adecuada. Cabe señalar que con el tiempo, no se ha mantenido tan bien como SOS.dll , por lo que este último puede incluir mejoras y correcciones de errores ausentes de la primera. En el momento de escribir esto, no había ninguna versión de Psscor para .NET 4.5.


En resumen, haz lo siguiente:

  1. Obtenga la versión de CLR del vertedero
  2. Encuentre y descargue el parche de Microsoft apropiado
  3. Extraiga el archivo sos.dll y mscordacwks.dll del parche
  4. Úselo

A continuación hay un ejemplo:

1. Después de cargar un volcado de emergencia, obtengo la versión que necesito:

>lm vm clr

me da

File version: 4.0.30319.18051

2. Busco una actualización de MS que contenga esta versión:

sos.dll 4.0.30319.18051

En este caso, google ofrece una página de MS KB con un enlace de descarga. Normalmente descargo la versión x64 porque contiene x86 y x64 dlls, así que ahora tengo Windows8-RT-KB2833958-x64.msu .

Nota: a veces es complicado obtener el parche requerido, pero no en este ejemplo.

3. Utilizando el administrador de archivos FAR Extraigo el archivo del gabinete desde este MSU:

Windows8-RT-KB2833958-x64.cab

Nota: A veces hay varios gabinetes dentro, por lo que debe verificar cuál contiene sos.dll.

Nota: A veces, los parches se distribuyen como .EXE, por lo que primero debe extraer los archivos MSU o MSP (lo hago con FAR) y luego extraer los gabinetes de ellos.

4. A veces FAR es capaz de extraer archivos de los CAB, pero a veces tienen una estructura muy diferente y yo uso Expand.exe desde WinAIK . WinAIK tiene 1.7 Gb ISO, pero solo necesita una pequeña parte. Yo uso el siguiente archivo BAT

mkdir Extracted ../winaik_amd64/servicing/Expand.exe "%1" -F:sos.dll "Extracted" ../winaik_amd64/servicing/Expand.exe "%1" -F:mscordacwks.dll "Extracted"

Este comando extrae todas las versiones de dlls especificados, cada uno dentro de su propio directorio. A veces hay 2 versiones de mscordacwks.dll y sos.dll. Creo que esto se debe al personal de GRD / LDR (QFE). En nuestro ejemplo, hay 4.0.30319. 18051 y 4.0.30319. 19079 . Compruebe las propiedades del archivo con Windows Explorer.

5. Cambie el nombre de los archivos de forma adecuada: mscordacwks.dll debe llamarse mscordacwks_% arch% _% arch% _% version% .dll y colocarse cerca del sos.dll

Entonces mscordacwks.dll (4.0.30319.18051) va a mscordacwks_AMD64_AMD64_4.0.30319.18051.dll

(versión x86 cambiar el nombre a mscordacwks_ x86_x86 _4.0.30319.18051.dll )

sos.dll puede permanecer intacto, pero lo renombro a sos.4.0.30319.18051.dll

Haz lo mismo para la versión 4.0.30319.19079 (para posibles necesidades futuras)

6. Copie estos archivos a la carpeta ''C: / SOS /' que contiene una gran cantidad de sos.4.xxxdll y mscordacwks_AMD64_AMD64_4.xxxdll

7. Úselo con

.load C:/SOS/sos.4.0.30319.18051.dll

Nota: A veces para .Net 4.5 necesita agregar ''0'' adicionales a mscordacwks versión mscordacwks_AMD64_AMD64_4.6.1055. 00 .dll en lugar de mscordacwks_AMD64_AMD64_4.6.1055. 0 .dll. No cavé más profundo, porque podría manejar esto dentro de un marco de tiempo pequeño.

Por cierto, WinDbg dirá si no se puede encontrar mscordacwks y especificará la versión (que tendrá el doble de ''0'' al final).


Esto es lo que funcionó para mí:

Descargue las siguientes DLL:

  • clr.dll
  • mscordacwks.dll
  • SOS.dll

desde esta carpeta en la máquina que generó el volcado:

C: / Windows / Microsoft.NET / Framework64 / v4.0.30319

Ejecute el siguiente comando. La ruta de acceso a SOS.DLL debe estar sin comillas, delimitadores de ruta no escaneados:

.load ruta para descargar SOS.DLL

Creo que se necesita una nueva sesión de WinDbg para que esto funcione.



WinDbg no podrá usar el adaptador de depuración mscordacwks.dll a menos que sea la misma versión que la del equipo original. Puede solucionar este error copiando esta DLL de la máquina de destino que generó el volcado a su directorio Herramientas de depuración para Windows.

Depuramos aplicaciones .NET 2.0 con WinDbg. Continuamente obtendríamos el mismo error con respecto a mscordacwks_x86_x86_2.0.50727.3615.dll. Tuve que copiar este archivo del servidor a mi cliente y ponerlo en la carpeta C: / Program Files / Debugging Tools for Windows (x86) /. WinDbg dejó de quejarse después de eso.

Si todo lo demás falla, puede intentar la depuración con WinDbg en el mismo servidor desde el que recuperó el volcado de bloqueo.


The version of SOS does not match the version of CLR you are debugging. Please load the matching version of SOS for the version of CLR you are debugging. CLR Version: 4.0.30319.1 SOS Version: 4.0.30319.235

Esto significa que la máquina de destino que realizó el volcado se está ejecutando en la versión 4.0.30319.1 CLR.
Su sistema se está ejecutando con la versión 4.0.30319.235 .

Esto se debe a que hubo una actualización de seguridad de .Net 4.0 que modificó los archivos CLR y SOS . Y algunas computadoras pueden no tener esta actualización todavía.

Ver: http://support.microsoft.com/kb/2572078

Esto puede causar que algunas de las líneas en la pila estén un poco equivocadas ... Puede evitar el error obteniendo SOS.dll y CLR.dll y mscordacwks.dll y mscorwks.dll de la versión original y cargándolas cuando carga el SOS.
Los archivos originales son usualmente en: C: / Windows / Microsoft.NET / Framework / v4.0.30319
Depende de la versión del marco ... y luego cópialos en una carpeta específica.
Cargue los archivos correctos de esta manera:

.load C:/CurrectFiles/sos

Tenga en cuenta que es simplemente "sos" y no sos.dll.