Можно ли заставить 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)?

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

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