Принуждение WinDbg для загрузки символов разгруженного модуля
Я отлаживаю модуль, для которого у меня есть только .exe и .pdb без личных символов.
Во время сеанса отладки мне нужно проверить внутреннюю структуру. Очевидно, что эта структура не отображается в PDB, поскольку она является частной, но, к счастью, у меня есть .h файл, где эта структура определена. Поэтому я могу создать некоторый фиктивный модуль, который использует эту структуру и получить файл PDB, содержащий эту структуру.
Теперь у меня есть разгруженный модуль с символами структуры, и я хотел бы загрузить его символы, чтобы выделить некоторую память для этой структуры. (без разгрузки оригинала .exe, я отлаживаю, конечно)
Проблема: кажется, что WinDbg позволяет только загружать символы для загруженных модулей...
Мой вопрос: Есть ли простой способ загрузить мои символы из выгруженного модуля?
Я пробовал .reload /i /f MyDll.dll
, но я всегда получаю ...MyDll.dll - unmatched
.
Установка sympath не помогла.
Любые идеи?
Ответы
Ответ 1
Вы можете заставить windbg загружать символы по определенному адресу, например.
0:000> .reload /f /i MyDll.dll=77777777
c:\sym\MyDll.pdb - unmatched
0:000> lm
start end module name
00000000`55555555 00000000`55555555 notepad (no symbols)
00000000`77530000 00000000`7762a000 USER32 (deferred)
00000000`77777777 00000000`77777777 MyDll_77777777 (private pdb symbols) c:\sym\MyDll.pdb
Непревзойденное предупреждение здесь состоит в том, что windbg не может сказать, что символы соответствуют правильной версии модуля, поскольку он не может найти отметки времени или контрольной суммы.
Ответ 2
Лучший способ - .reload /unl MyDll.dll
Выгруженный список модулей содержит отметку времени (для сопоставления изображений /pdb ) и базового адреса изображения. Использование /unl
указывает WinDBG использовать эту информацию.