Что делать с версией 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'.

Я пытаюсь понять, что происходит. Я настроил создание дампа для рабочего процесса-сироты, как описано в этой КБ. При возникновении тупика создается минидамп.
Затем я беру этот минидамп, чтобы попытаться понять, что произошло. Вот я застрял.

Я запускаю 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. Это не помогает.


person Shrike    schedule 15.09.2011    source источник
comment
Хорошая статья о совместимости SOS / MSCORDACWKS - jonathan.dickinsons.co .za / blog / 2010/08 / windbg-stack-fix.   -  person Shrike    schedule 16.09.2011
comment
Мне это помогло: blogs.msdn.com/b/dougste/archive/2009/02/18/   -  person Wallace Kelly    schedule 10.09.2013


Ответы (6)


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

person Paul Williams    schedule 15.09.2011
comment
благодаря. Кстати, похоже, что .sympath установил предоставленный путь глобально. - person Shrike; 16.09.2011

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

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

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

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

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

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

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

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

person Thomas Bratt    schedule 17.04.2012
comment
Я использовал .load psscor4.dll и последовал вашему совету, чтобы получить clr sos и mscordacwks от цели. Это исправило это для меня. - person GregC; 08.05.2012
comment
Где я могу получить правильные версии этих DLL, если у меня нет доступа к неисправному компьютеру? Я могу найти эти библиотеки DLL из правильных обновлений Windows (например, этого) и загрузил файл обновления (.msu). Но когда я распаковываю .msu файл, это всего лишь набор cabs-файлов. Мне показалось, что я вспомнил веб-сайт со всеми версиями двоичных файлов CLR для загрузки. - person KFL; 09.12.2014
comment
не забудьте проверить разрядность дампа, который вы пытаетесь загрузить, путь выше для x64 clr, для дампа x86 возьмите dll из C:\Windows\Microsoft.NET\Framework\v4.0.30319 - person propagated; 30.05.2018

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

К сожалению, некоторые версии mscordacwks.dll не были проиндексированы, а это означает, что приведенное выше не всегда будет работать. В таких случаях вы можете попытаться получить правильную версию с компьютера, на котором был сделан дамп, например, Yocahi и Упомянутый Томас (например, из 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.

person Ohad Schneider    schedule 23.04.2014

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.

person Yochai Timmer    schedule 22.05.2012

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

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

person Dunken    schedule 12.12.2013

Вкратце сделайте следующее:

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

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

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

>lm vm clr

это дает мне

File version:     4.0.30319.18051

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

sos.dll 4.0.30319.18051

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

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

3. Используя файловый менеджер FAR, я извлекаю архив кабинета из это МГУ:

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

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

person mistika    schedule 08.02.2017