WinDbg Dr. Watson minidump - требуется pdb / dll, изначально созданный для установленной версии?

Asked
Viewd7366

3

У меня есть файл mindmp из-за сбоя целевого приложения. Могу ли я пересобрать файлы dll / pdb для версии программного обеспечения и правильно отображать символы загрузки windbg?

Моя проблема в том, что наши файлы pdb хранятся только для основных выпусков (к сожалению). Это ежедневная сборка, которую я могу перестроить самостоятельно, но я спотыкаюсь из-за ошибок.

С! sym шумит: «Заголовок изображения не соответствует заголовку изображения в памяти»

 DBGENG:  C:\...\XXX.dll image header does not match memory image header.
DBGENG:  XXX.dll - Partial symbol image load missing image info
DBGHELP: Module is not fully loaded into memory.
DBGHELP: Searching for symbols using debugger-provided data.
DBGHELP: C:\...\XXX.pdb - mismatched pdb
 

Обратите внимание, что я создал pdb с dll, они из того же каталога RELEASE (следует ли мне создавать отладку?)

Эти тезисы представляют собой релизные сборки (так как релизные сборки устанавливаются на целевой объект и вылетают из строя), следует ли мне каким-то образом использовать библиотеки DLL отладочной сборки для получения дополнительной информации о символах?

5 ответов

8

По моему опыту, наверное, нет.

Если у вас есть точный каталог сборки и сборка с точно такими же настройками компилятора, это может сработать. Вы определенно не сможете загружать символы из отладочной сборки в аварийный дамп релиза.

Вам нужно будет включить опцию "загружать что угодно": .symopt + 0x40, чтобы Windbg игнорировал различия в отметках времени.

2

если у вас все еще есть точный исходный код, из которого был скомпилирован образ, перестройте его, создав новый файл pdb, а затем проинструктируйте WinDbg принудительно загрузить этот pdb при открытии аварийного дампа - в моей практике однажды это сработало.

1

Файлы PDB привязаны к своим EXE-файлам по идентификатору GUID и "возрасту" (порядковый номер). Они встроены в EXE и PDB. GUID восстанавливается при каждой полной сборке, а «возраст» изменяется при каждой инкрементной сборке.

Отладчик использует их, чтобы убедиться, что он ищет правильный PDB для EXE-файла.

Я не знал об инструменте chkmatch, упомянутом SteveMan, но подозреваю, что он работает, исправляя GUID / возраст, чтобы они совпадали.

11

Утилита ChkMatch разработана именно для этого сценария. Пока у вас есть исходный .EXE, вы можете перекомпилировать исходники (с теми же настройками компилятора и компилятора) и исправить новый .PDB, чтобы он соответствовал старому .EXE.

В этом примере OriginalExecutable.exe - это исполняемый файл, у которого больше нет файла .PDB, а RebuiltPDB.pdb - это файл, созданный путем восстановления исходного источник.

 chkmatch -m OriginalExecutable.exe RebuiltPDB.pdb
 

Теперь, когда два файла имеют свои оригинальные имена, отладчик должен принять их как совпадающую пару.