Что делать с "Версия SOS не соответствует версии CLR, которую вы отлаживаете" в WinDbg?

У меня проблема с некоторыми из моих приложений. Это приложение на основе wcf, работающее под IIS6 в Windows 2003 Server (x86):
В журнале событий я получаю такую ​​ошибку из источника 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'.

Я пытаюсь понять, что происходит. Я создал создание дампа для Orphan Worker Process, как описано в этом KB. Когда произошел тупик, создается мини-насос.
Затем я беру этот мини-кубок, чтобы попытаться понять, что произошло. Здесь я застрял.

Я запускаю WinDbg x86, открываю мой дамп, а затем:

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

Что делать с этой ошибкой - "Версия SOS не соответствует версии CLR, которую вы отлаживаете"?

Такая же ошибка ( "Версия SOS не соответствует версии CLR, которую вы отлаживаете" ) Я получаю, когда открываю мини-диск в VS2010.

Я прочитал этот пост - http://tech-thinker.com/Forums/tabid/62/forumid/12/postid/471/scope/posts/Default.aspx и попытался установить KB2518870. Это не помогает.

Ответ 1

WinDbg не сможет использовать отладочный адаптер mscordacwks.dll, если он не такой же, как у оригинальной машины. Вы можете обойти эту ошибку, скопировав эту DLL с целевой машины, которая сгенерировала дамп в каталоге "Отладка для Windows".

Отлаживаем приложения .NET 2.0 с помощью WinDbg. Мы будем постоянно получать такую ​​же ошибку в отношении mscordacwks_x86_x86_2.0.50727.3615.dll. Мне пришлось скопировать этот файл с сервера на мой клиент и поместить его в папку C:\Program Files\Debugging Tools for Windows (x86) \. После этого WinDbg перестала жаловаться.

Если все остальное не удается, вы можете попробовать отладку с помощью WinDbg на том же сервере, на котором вы извлекли дамп аварий.

Ответ 2

Это то, что сработало для меня:

Скачайте следующие библиотеки DLL:

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

из этой папки на машине, которая сгенерировала дамп:

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

Выполните следующую команду. Путь к SOS.DLL должен быть без кавычек, без ограничений пути:

.load путь к скачанному SOS.DLL

Я думаю, для этого требуется новый сеанс WinDbg.

Ответ 3

Основная проблема обычно заключается в несоответствии версии mscordacwks.dll (mscorwks.dll сама по себе не нужна, если был сделан полный сброс). Теоретически он должен быть доступен с сервера символов - просто запустите .cordll -ve -u -l. Для получения дополнительной информации о mscordacwks.dll см. Не удалось загрузить DLL данных, 0x80004005" - ИЛИ - Что такое mscordacwks.dll.

К сожалению, некоторые версии mscordacwks.dll не были проиндексированы, то есть вышеприведенное не всегда будет работать. В таких случаях вы можете попробовать и получить правильную версию с машины, на которой была сделана свалка, в качестве Yocahi и Thomas (например, от C:\Windows\Microsoft.NET\Framework64\v4.0.30319). Как только вы его получите, введите следующую команду: .cordll -u -ve -lp PathToFolderContainingMscorDAC. Конечно, эта машина может быть недоступна или, возможно, была исправлена ​​с момента снятия свалки.

К счастью, существует способ извлечь mscorwdacwks.dll из фактического пакета обновления KB (он находится в одном из cab файлы внутри исполняющего файла self extracting - используйте инструмент, например 7-Zip, чтобы извлечь его). Существуют также репозитории обновлений .NET(любезно предоставлены сотрудниками MS Дугом Стюартом), поэтому вы можете просмотреть их для нужного номера строкой, который вам нужен:

Как только у вас будет правильный mscordacwks.dll, предупреждение SOS.dll можно игнорировать в большинстве случаев, так как самая последняя версия SOS.dll будет работать большую часть времени, несмотря на предупреждение. Однако в некоторых случаях необходима правильная версия SOS.dll (и в качестве бонуса вы избавляетесь от досадных предупреждений). Dunken ссылается на сообщение которое должно быть полезно в этом отношении (в основном вы необходимо поместить сервер символов в переменную среды _NT_SYMBOL_PATH и запустить !analyze –v без загрузки SOS.dll сначала - он загрузит правильную версию). Если это не сработает, вы можете попробовать извлечь SOS.dll из одного из пакетов обновлений, как описано выше. Этот сайт может оказаться более простым в использовании для этой цели, поскольку он специально индексирует версии SOS.dll.

Наконец, рассмотрим PsscorR2 (для .NET 2.0-3.5) и Psscor4 (для .NET 4.0). Psscor - это надмножество SOS.dll, которое не жалуется на несоответствующие версии, если вы используете соответствующую основную версию. Следует отметить, что со временем он не поддерживался, а также SOS.dll, поэтому последний может включать улучшения и исправления ошибок, отсутствующие в первом. На момент написания не было версии Psscor для .NET 4.5.

Ответ 4

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

Это означает, что целевая машина, которая сделала дамп, запущена в версии CLR 4.0.30319.1.
Ваша система работает с версией 4.0.30319.235.

Это связано с тем, что было обновлено обновление .Net 4.0, которое изменило файлы CLR и SOS. И некоторые компьютеры могут не иметь этого обновления.

Смотрите: http://support.microsoft.com/kb/2572078

Это может привести к тому, что некоторые из строк в стеке будут немного неправильными... Вы можете избежать ошибки, получив SOS.dll и CLR.dll и mscordacwks.dll и mscorwks.dll исходной версии и загрузите их при загрузке SOS.
Исходные файлы обычно находятся под: C:\Windows\Microsoft.NET\Framework\v4.0.30319
Зависит от версии фреймворка... и затем скопирует их в определенную папку.
Загрузите правильные файлы следующим образом:

.load C:\CurrectFiles\sos

Обратите внимание, что это просто "sos", а не sos.dll.

Ответ 5

Вы можете автоматически загрузить правую SOS.dll. Посмотрите замечательный пост в блоге Джона Роббинса http://wintellect.com/blogs/jrobbins/automatically-load-the-right-sos-for-the-minidump

Вы также можете проверить с помощью .chain то, что уже загружено. В некоторых случаях вам необходимо сначала выгрузить (например, .unload sos) неправильно загруженные dll.

Ответ 6

Короче говоря, сделайте следующее:

  • Получить версию CLR из дампа
  • Найти и загрузить соответствующий патч Microsoft
  • Извлеките файлы sos.dll и mscordacwks.dll из патча
  • Используйте его

Ниже приведен пример:

1. После загрузки дампа сбоя я получаю нужную версию:

>lm vm clr

это дает мне

File version:     4.0.30319.18051

2. Google для обновления MS, содержащего эту версию:

sos.dll 4.0.30319.18051

В этом случае google предоставляет страницу MS KB с ссылкой на скачивание.  Я обычно загружаю версию x64, потому что в ней содержатся как x86, так и x64 dll, поэтому теперь у меня есть Windows8-RT-KB2833958-x64.msu.

Примечание: иногда сложно получить требуемый патч, но не в этом примере.

3. Использование Файловый менеджер FAR Извлеките архив из этого MSU:

Windows8-RT-KB2833958-x64.cab

Примечание: Иногда внутри есть несколько шкафов, поэтому вам нужно проверить, какой из них содержит sos.dll.

Примечание.. Иногда исправления распространяются как .EXE, поэтому вам сначала нужно извлечь файлы MSU или MSP (я делаю это с помощью FAR), а затем извлечь из них шкафы.

4. Иногда файлы из CAB могут быть извлечены FAR, но иногда они имеют совсем другую структуру, и я использую Expand.exe из WinAIK. WinAIK - 1,7 ГБ ISO, но вам нужно лишь небольшую часть. Я использую следующий файл BAT

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

Эта команда извлекает все версии указанных DLL, каждая из которых находится внутри своего собственного каталога. Иногда есть 2 версии mscordacwks.dll и sos.dll. Я считаю, что это из-за сотрудников GRD/LDR (QFE). В нашем примере есть 4.0.30319. 18051 и 4.0.30319. 19079. Проверьте свойства файла с помощью проводника Windows.

5. Переименуйте файлы соответствующим образом: mscordacwks.dll должен быть назван mscordacwks_% arch% _% arch% _% version%.dll и помещен рядом с sos.dll

Итак, mscordacwks.dll(4.0.30319.18051) отправляется в mscordacwks_AMD64_AMD64_4.0.30319.18051.dll

(версия x86 переименовывается в mscordacwks_ x86_x86 _4.0.30319.18051.dll)

sos.dll может оставаться неизменным, но я переименую его в sos.4.0.30319.18051.dll

Сделайте то же самое для версии 4.0.30319.19079 (для возможных будущих потребностей)

6. Скопируйте эти файлы в папку "C:\SOS", в которой содержится много файлов sos.4.x.x.x.dll и mscordacwks_AMD64_AMD64_4.x.x.x.dll

7. Используйте его с

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

Примечание: Иногда для .Net 4.5 вам нужно добавить дополнительную "0" в версию mscordacwks mscordacwks_AMD64_AMD64_4.6.1055. 00.dll вместо mscordacwks_AMD64_AMD64_4.6.1055. 0.dll. Я не копал глубже, потому что мог справиться с этим в течение небольшого промежутка времени.

BTW, WinDbg скажет, что если mscordacwks не может быть найден и будет указывать версию (которая будет иметь двойной "0" в конце).