Что делать с «версией SOS, не соответствующей версии CLR, которую вы отлаживаете» в WinDbg? - PullRequest
41 голосов
/ 15 сентября 2011

У меня проблема с некоторыми из моих приложений.Это приложение на основе 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 .Это не помогает.

Ответы [ 6 ]

44 голосов
/ 17 апреля 2012

Вот что у меня сработало:

Загрузите следующие библиотеки DLL:

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

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

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

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

.load путь к загруженной SOS.DLL

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

24 голосов
/ 15 сентября 2011

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 на том же сервере, с которого вы получили аварийный дамп.

19 голосов
/ 23 апреля 2014

Основная проблема обычно заключается в несовпадении версии 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 файлов внутри самораспаковывающегося исполняемого файла - используйте такой инструмент, каккак 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.

8 голосов
/ 22 мая 2012
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.

2 голосов
/ 12 декабря 2013

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

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

1 голос
/ 08 февраля 2017

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

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

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

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

>lm vm clr

дает мне

File version:     4.0.30319.18051

2. Я гуглюдля обновления 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 ISO 1.7 Гб, но вам нужна только небольшая часть.Я использую следующий BAT-файл

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

Эта команда извлекает все версии указанных библиотек, каждая из которых находится в своем собственном каталоге.Иногда есть 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.xxxdll и mscordacwks_AMD64_AMD64_4.xxxdll

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.Я не копал глубже, потому что мог бы справиться с этим в течение короткого периода времени.

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

...