2011-09-15 24 views
37

Tengo un problema con algunas de mis aplicaciones. Es una aplicación basada en WCF se ejecuta bajo IIS6 en Windows Server 2003 (x86):
En Registro de sucesos me sale un error de este tipo de fuente "W3SVC-WP" (EventID = 2,262):¿Qué hacer con "La versión de SOS no coincide con la versión de CLR que está depurando" en WinDbg?

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

estoy tratando de descubrir qué está pasando. He configurado la creación de volcado para Proceso de trabajo huérfano como se describe en este 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.

corro WinDBG x86, abre 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 está depurando"?

El mismo error ("La versión de SOS no coincide con la versión de CLR que está depurando") que obtengo 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, y he intentado instalar KB2518870. No ayuda.

+0

Buen artículo sobre la compatibilidad de SOS/MSCORDACWKS - http://jonathan.dickinsons.co.za/blog/2010/08/windbg-stack-fix/ – Shrike

+0

Esto me ayudó: http://blogs.msdn.com/ b/dougste/archive/2009/02/18/failed-to-load-data-access-dll-0x80004005-or-what-is-mscordacwks-dll.aspx – Wally

Respuesta

23

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 las 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 falla todo lo demás, puede intentar la depuración con WinDbg en el mismo servidor desde el que recuperó el volcado de emergencia.

+0

gracias. Por cierto, parece que .sympath configuró la ruta suministrada globalmente. – Shrike

41

Esto es lo que funcionó para mí:

descargar los siguientes archivos DLL:

  • clr.dll
  • Mscordacwks.dll
  • Sos.dll

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

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

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

.load ruta al SOS descargado.DLL

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

+3

Utilicé .load psscor4.dll y seguí su consejo para tomar clr sos y mscordacwks del objetivo. Esto me lo arregló. – GregC

+0

¿Dónde puedo obtener las versiones correctas de esas DLL si no tengo acceso a la máquina defectuosa? Puedo localizar esos archivos DLL desde las actualizaciones correctas de Windows (por ejemplo, [éste] (http://support.microsoft.com/kb/2898870)), y he descargado el archivo de actualización (.msu). Pero cuando descomprimo el archivo '.msu', son solo un montón de archivos de cabinas. Me pareció recordar un sitio web con todas las versiones de binarios CLR para descargar. – KFL

6
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 el equipo de destino que hizo que el vertedero se está ejecutando en la versión CLR 4.0.30319.1.
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 cambió 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 hacer que algunas de las líneas de la pila a ser un poco mal ... Puede evitar el error mediante la obtención de la Sos.dll y CLR.dll y mscordacwks.dll y mscorwks.dll de la versión original y los carga cuando carga el SOS.
Los archivos originales son generalmente en: C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319
Depende de la versión del marco ... y luego cópielos en una carpeta específica.
cargar los archivos correctos de esta manera:

.load C:\CurrectFiles\sos 

Tenga en cuenta que es sólo "SOS" y no Sos.dll.

16

El problema central generalmente se encuentra en una versión mscordacwks.dll que no coincide (en sí no debería ser necesario si se realizó un volcado completo). En teoría, debería poder obtenerse desde el servidor de símbolos: simplemente ejecute .cordll -ve -u -l. Para obtener más información sobre mscordacwks.dll, vea Failed to load data access DLL, 0x80004005” – OR – What is mscordacwks.dll.

Desafortunadamente, 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 tomó el volcado, como 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 way to extract mscorwdacwks.dll from the actual update KB package (que reside en uno de los cab archivos dentro del mismo archivo ejecutable de extracción - utilizar una herramienta como 7-Zip para extraerlo). También existen repositorios de.NET Actual (cortesía de MS empleado Doug Stewart), para que pueda navegar por ellos por el número de compilación exacto que requieren:

vez que tenga la correcta mscordacwks.dll, la SOS.dll la advertencia 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 también se necesita la versión correcta de SOS.dll (y como beneficio adicional, se deshace de las molestas advertencias). Dunken enlaces a una blog post que deberían ser útil en ese sentido (básicamente, es necesario colocar el servidor de símbolos en la variable de entorno y ejecutar _NT_SYMBOL_PATH!analyze –vsin cargarSOS.dll primero - se cargará la versión correcta en sí). Si eso no funciona, puede intentar extraer SOS.dll de uno de los paquetes de actualización como se describe arriba. This site puede resultar más fácil de usar para ese propósito, ya que indexa específicamente las versiones SOS.dll. Por último, 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 existía la versión Psscor para .NET 4.5.

1

En resumen, haga lo siguiente:

  1. obtener la versión CLR forman el vertedero
  2. encontrar y descargar el parche de Microsoft adecuada
  3. Extracto de la sos.dll y Mscordacwks.dll de el parche
  4. Úselo

A continuación se muestra un ejemplo:

1. Después de cargar un volcado de bloqueo consigo 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 da un MS KB page 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 difícil obtener el parche requerido, pero no en este ejemplo.

3. Usando FAR file manager extraigo archivo de gabinete de esta MSU:

Windows8-RT-KB2833958-x64.cab

Nota: A veces hay varios armarios en el interior, por lo necesita 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. veces los archivos de CAB pueden ser extraídos por mucho, pero a veces tienen una estructura muy diferente y utilizar Expand.exe de WinAIK. WinAIK tiene 1.7 Gb ISO, pero solo necesita una pequeña parte. utilizo 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" 

extractos Este comando todas las versiones de los archivos DLL 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. y 4.0.30319. . Compruebe las propiedades del archivo con Windows Explorer.

5. Cambiar el nombre de los archivos de forma apropiada: Mscordacwks.dll deben ser nombrados de mscordacwks_% arco% _% arco% _% versión% .dll y se coloca cerca de la sos.dll

Así

Mscordacwks.dll (4.0.30319.18051) va a mscordacwks_AMD64_AMD64_4.0.30319.18051.dll

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

sos.dll podría permanecer como está intacta, pero cambie el nombre a sos.4.0.30319.18051.dll

hacer lo mismo para 4.0 .30319.19079 versión (para posibles necesidades futuras)

6. copiar estos archivos en 'C: \ SOS \' carpeta que contiene una gran cantidad de sos.4.xxxdll y mscordacwks_AMD64_AMD64_4.xxxdll

7. lo uso con

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

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

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

Cuestiones relacionadas