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

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

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