У меня есть дамп, который как .NET версии загруженную:Использование SOS на свалке с .NET 2 (mscorwks) и .NET 4 (CLR)
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
=== UPDATE ===
.cordll
в принципе нормально. По умолчанию он будет использовать среду .NET 4. Такое поведение можно изменить на .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 для получения списка управляемых потоков в процессе.
=== UPDATE ===
Как полагает Марио Хьюардт, сложный сценарий с указанием полного пути SOS можно избежать только загрузки одного расширения SOS в процесс (или разгрузки один в случае они уже загружены), или мы можем использовать .setdll
для определения стандартной версии SOS по умолчанию.
Однако это не улучшает анализ.
=== UPDATE ===
Я также попытался разгрузки один из .NET модулей по .reload /u
в надежде, что WinDbg/SOS не будет в конфликте больше, но до сих пор не повезло.
Это действительно некрасиво. Проблема возникает из-за нашей архитектуры плагина. Само приложение - это .NET2, поэтому изначально используется .NET. Затем плагины используют .NET4, поэтому это также будет загружено. –