Можно ли заставить 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 's имя подпапки, поэтому 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___.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 может 't знать временную метку и размер модуля 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)?