Использование SOS в дампе с .NET 2 (mscorwks) и .NET 4 (clr)

У меня есть дамп, в котором загружены обе версии .NET:

0:000> lm m clr
start    end        module name
65490000 65aff000   clr        (deferred)             
0:000> lm m mscorwks
start    end        module name
6a980000 6af2c000   mscorwks   (deferred) 

Теперь я не уверен, какую версию SOS использовать. Оба загрузятся без проблем.

0:000> .loadby sos mscorwks
0:000> .loadby sos clr

Как узнать, какую версию лучше всего использовать для анализа? Или мне всегда будут нужны оба?

Надежен ли в этом случае .cordll -ve -u -l?

.symfix c:\symbols
.cordll -ve -u -l

CLRDLL: C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscordacwks.dll:4.0.30319.18047 f:8
doesn't match desired version 4.0.30319.296 f:8
CLRDLL: Loaded DLL c:\symbols\mscordacwks_x86_x86_4.0.30319.296.dll\50484AA966f000\mscordacwks_x86_x86_4.0.30319.296.dll
CLR DLL status: Loaded DLL c:\symbols\mscordacwks_x86_x86_4.0.30319.296.dll\50484AA966f000\mscordacwks_x86_x86_4.0.30319.296.dll

Поток 0 показывает mscorwks. Используемые команды:

~0s
k

=== ОБНОВЛЕНИЕ ===

.cordll в принципе нормально. По умолчанию он будет использовать .NET 4 Framework. Это поведение может быть изменено.cordll -I.

Я получил обе версии SOS, которые соответствуют версии целевого компьютера и загружены по пути

.load C:\SOS\4.0.30319.296\SOS.dll

Я обновил WinDbg 6.2 до последней версии 6.3. Все еще не лучше.

Я также спросил Стива Джонсона, автора SOSEX, который предложил.cordll -I, но это также не работает в моем дампе, ни с именем модуля, ни с базовым адресом.

.cordll -I clr
.cordll -I 65490000

Любая попытка запустить!threads всегда приводит к

Не удалось запросить ThreadStore.

Любая попытка запустить!clrstack всегда приводит к

Невозможно пройти управляемый стек. Текущий поток, скорее всего, не является управляемым потоком. Вы можете запустить! Threads, чтобы получить список управляемых потоков в процессе.

=== ОБНОВЛЕНИЕ ===

Как предложил Марио Хьюардт, сложного сценария с указанием полного пути SOS можно избежать, загрузив в процесс только одно расширение SOS (или выгрузив его, если они уже загружены), или мы можем использовать.setdll чтобы определить версию SOS по умолчанию нам нравится.

Однако это не улучшает анализ.

=== ОБНОВЛЕНИЕ ===

Я также попытался выгрузить один из модулей .NET.reload /u в надежде, что WinDbg / SOS больше не будет в конфликте, но все же не повезло.

Ответы на вопрос(2)

Ваш ответ на вопрос