Символы (pdb) для родной dll не загружаются из-за шага после сборки - PullRequest
6 голосов
/ 17 мая 2009

У меня есть нативный релиз dll, который построен с символами. Есть шаг пост пост сборки, который модифицирует dll. Шаг посткомпиляции выполняет некоторое сжатие и, возможно, добавляет некоторые данные. Файл pdb по-прежнему действителен, однако ни WinDbg, ни Visual Studio 2008 не загрузят символы для dll после шага после сборки. Какие биты в файле pdb или dll нам нужно изменить, чтобы получить либо WinDbg, либо Visual Studio для загрузки символов при загрузке дампа, на который ссылается наша dll выпуска?

Имеет ли значение размер файла? Контрольная сумма или хэш? Отметка времени?

Изменить дамп? или изменить pdb? изменить DLL перед отправкой?

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

Ответы [ 2 ]

12 голосов
/ 17 мая 2009

Этот пост привел меня к chkmatch . На обработанной dll chkmatch показывает эту информацию:

Executable:
TimeDateStamp: 4a086937
Debug info: 2 ( CodeView )
TimeStamp: 4a086937  Characteristics: 0  MajorVer: 0  MinorVer: 0
Size: 123  RVA: 00380460  FileOffset: 00380460
CodeView signature: sUar

Debug information file:
Format: PDB 7.00
Result: unmatched (reason: incompatible debug information formats)

С тем же самым pdb против предварительно обработанной dll, он сообщает об этом:

Executable:
TimeDateStamp: 4a086937
Debug info: 2 ( CodeView )
TimeStamp: 4a086937  Characteristics: 0  MajorVer: 0  MinorVer: 0
Size: 123  RVA: 00380460  FileOffset: 00380460
CodeView format: RSDS
Signature: (my guid)  Age: 19
PdbFile: (my path)

Debug information file:
Format: PDB 7.00
Signature: (my matching guid)  Age: 19

Я открыл обе версии dll и пошел к смещению 00380460. В исходной версии достаточно ясно, я вижу имя pdb, но в постобработанной версии нет информации pdb с этим смещением. Я искал путь PDB и нашел точно такой же блок - только с другим смещением. Затем я сделал бин поиск байтов "38 00 60 04" в оригинальной DLL. Глядя на то же смещение в обработанной DLL, я нашел те же байты. Поэтому я скорректировал RVA и смещение (расположенное путем сопоставления байтов). Бинго! Теперь chkmatch сообщает о тех же самых результатах для обработанной dll, что и оригинал (за исключением RVA и FileOffset, которые я изменил).

Редактировать : подтверждено, теперь Visual Studio загружает символы для дампов, которые ссылаются на обработанную dll.

2 голосов
/ 17 мая 2009

в Windbg попробуйте использовать .symopt + 40 , это приведет к загрузке pdb.

...