Можно ли заставить WinDBG найти mscordacwks.dll в хранилище символов?
Существует множество ручных способов заставить WinDBG найти mscordacwks.dll без хранилища символов (поместить файл в путь куда-либо, поместить его в ту же папку, что и windbg.exe, поместить в папку Framework \ v, указав путь в Использование WinDBG.cordll -lp c:\dacFolder
и т. д.), но все они исправляют толькоменя, Мне нужно исправить это в целом длявсе, кто использует мой магазин символов.
Возможные решения, которые я могу себе представить:
WinDBG должен проверять хранилище символов, используя имя подпапки mscordacwks.dll вместо имени папки mscorwks.dll.SymStore.exe необходимо добавить mscordacwks.dll под именем подпапки mscorwks.dll, чтобы WinDBG обнаружил его при поиске.Q:Возможна ли какая-либо из этих вещей, или есть другой способ, которым я не думаю, чтобы решить проблему?
ФонПри анализе процесса .NET я столкнулся с (по-видимому, распространенной) проблемой, заключающейся в том, что psscor2 (и sosex) не может найти соответствующий файл mscordacwks.dll на моем компьютере. Ошибка в WinDBG:
Failed to load data access DLL, 0x80004005
Verify that 1) you have a recent build of the debugger (6.2.14 or newer)
2) the file mscordacwks.dll that matches your version of mscorwks.dll is
in the version directory
3) or, if you are debugging a dump file, verify that the file
mscordacwks_<arch>_<arch>_<version>.dll is on your symbol path.
4) you are debugging on the same architecture as the dump file.
For example, an IA64 dump file must be debugged on an IA64
machine.
You can also run the debugger command .cordll to control the debugger's
load of mscordacwks.dll. .cordll -ve -u -l will do a verbose reload.
If that succeeds, the SOS command should work on retry.
If you are debugging a minidump, you need to make sure that your executable
path is pointing to mscorwks.dll as well.
На это множество вопросов SO и множество хороших ответов, практически все из которых в конечном итоге ссылаются на выдающийся пост в блоге Дуга Стюарта:Что такое mscordacwks.dll?.
Благодаря этому я исправил ситуацию, получив правильный файл mscordacwks.dll и разместив его здесь:
"C:\Symbols\mscordacwks_AMD64_AMD64_2.0.50727.4216.dll\4E1545829a3000\mscordacwks_AMD64_AMD64_2.0.50727.4216.dll"
где я знал, что WinDBG будет смотреть, потому что я ранее пробовал это с!sym noisy
.
Итак, все готово, но я должен был поместить его в этот путь физически, а не добавлять его на свой сервер символов через обычныйsymstore.exe
механизм. Так как мой магазин символов используется не только мной, я должен сделать это правильно для всех, кто использует магазин.
И это проблема. Когда я добавляю с помощьюsymstore.exe
вместо того, чтобы идти по вышеуказанному пути, он идет в:
"C:\Symbols\mscordacwks_AMD64_AMD64_2.0.50727.4216.dll\4E1545CB1bd000\mscordacwks_AMD64_AMD64_2.0.50727.4216.dll"
Единственная разница в том, что имя подпапки4E1545CB1bd000
здесь вместо4E1545829a3000
что WinDBG ищет.
Причина этого заключается в том, что при добавлении двоичного файла в хранилище символовsymstore.exe
использует PE двоичного файла, чтобы получить временную метку изображения и размер изображения. В случае этого конкретного .dll,dumpbin.exe /headers mscordacwks.dll
показывает, что это:
0x4E1545CB
(Чт 07 июля 01:36:11 2011)Размер изображения:0x1BD000
Следовательно, имя подпапки4E1545CB1BD000
.
WinDBG, с другой стороны, ищет подпапку, основанную на временной метке и размере изображения.mscorwks.dllнеmscordacwks.dllпотому что первый загружается в процесс, а не последний. WinDBG не может знать временную метку и размер модуля DAC, потому что этот модуль не находится в дампе процесса.
Как дальнейшая проверка этого объяснения,dumpbin.exe /headers mscorwks.dll
показывает:
0x4E154582
(Чт 07 июля 01:34:58 2011)Размер изображения:0x9A3000
который вы можете увидеть добавить в имя подпапки4E1545829A3000
.
Зная об этом, теперь стало намного понятнее, почему все эти многочисленные версии mscordacwks.dll, с которыми люди продолжают сталкиваться, отсутствуют на серверах символов Microsoft. Я уверен, что они там, просто WinDBG и psscor2 не могут их найти, потому что они выбирают неправильное имя подпапки. Почему это даже мешает искать путь к символам, мне не понятно, так как он гарантированно никогда его не найдет!
Так что это мой вызов. Могу ли я как-то заставитьsymstore.exe
добавить mscordacwks.dll, используя информацию PE для mscorwks.dll? Если нет, я что-то упускаю из-за WinDBG и psscor2, возможно, у них есть способ узнать правильную временную метку и размер файла mscordacwks.dll, даже если он не загружен (и способ фактически использовать их вместо mscorwks.dll). )?