Внедрить информацию о символах отладки .pdb в файл .exe в Visual Studio - PullRequest
10 голосов
/ 26 августа 2010

Я экспериментирую с инструментом анализа, который может анализировать исполняемые файлы со встроенной информацией о символах отладки в Windows. Пробуя этот инструмент в нескольких проектах с открытым исходным кодом, я понимаю, что большинство сборок не хранит символическую информацию в исполняемых файлах. Я могу скомпилировать исходный код с помощью VS (2008), но сборка обычно хранит отладочную информацию в отдельном файле .pdb, а не в файле .exe (к сожалению, я хочу только прочитать отладочную информацию из файла .exe, а не Файл .pdb: - ().

Кто-нибудь знает способ встраивания отладочной информации символов в один файл .exe с помощью Visual Studio?

Ответы [ 5 ]

6 голосов
/ 28 февраля 2017

Я знаю, что это довольно старая проблема, но эта функция недавно была объединена с Roslyn: https://github.com/dotnet/roslyn/issues/12390

5 голосов
/ 19 августа 2014

MSDN говорит, что это невозможно.

Невозможно создать .exe или .dll, которая содержит отладочную информацию. Отладочная информация всегда помещается в файл .pdb.

5 голосов
/ 28 октября 2011

Я пока не знаю, как это сделать, но есть статья на MSDN, в которой об этом говорится.

Переносимый исполняемый файл (т. Е. .exe или .dll) может иметь флаг присутствует в заголовке : ( архив )

IMAGE_FILE_DEBUG_STRIPPED

Отладочная информация была удалена и сохранена отдельно в отдельном хранилище в a.dbg file.

Это означает, что отладочная информация может быть в исполняемого файла и имеет опцию для удаления и сохраненияв отдельном файле .dbg.

Из статьи MSDN Файлы DBG : ( архив )

Файлы DBGявляются файлами формата переносимых исполняемых файлов (PE), которые содержат отладочную информацию в формате Codeview для отладчика Visual Studio (и, возможно, других форматов, в зависимости от того, как была создана DBG).Если у вас нет исходного кода для определенного кода, такого как библиотеки или API-интерфейсы Windows, файлы DBG разрешают отладку.Файлы DBG также позволяют выполнять отладку OLE RPC.

Файлы DBG были заменены файлами PDB, которые теперь чаще используются для отладки.

Вы можете использовать утилиту REBASE.EXE дляудалить отладочную информацию из исполняемого файла формата PE и сохранить ее в файле DBG.Поле признака файла IMAGE_FILE_DEBUG_STRIPPED в заголовке PE-файла сообщает отладчику, что информация Codeview разбита на отдельный файл DBG.

В статье базы знаний, описывающей формат COFF, упоминается утилита dumpbin, иэто /SYMBOLS опция:

/SYMBOLS      Setting this option causes DUMPBIN to display the COFF symbol
              table. Symbol tables exist in all object files. A COFF symbol
              table appears in an image file only if it is linked with
              /DEBUG /DEBUGTYPE:COFF

Следующий шаг, и часть, которая ответит на наш вопрос:

  • в каком формате встроена отладочная информация?
  • где в PE хранится встроенная отладочная информация?(ресурс ?, раздел данных?)

Но ответ "это невозможно сделать" кажется неправильным.

См. также

2 голосов
/ 26 августа 2010

В Visual Studio нет встроенной поддержки для этого типа операций (по крайней мере, для управляемых языков). Файлы .PDB и .EXE создаются одновременно и не имеют возможности для встраивания. Я даже не уверен, что формат .EXE поддерживает встраивание символов PDB, хотя я могу ошибаться в этом вопросе.

Единственный курс, который я вижу, - это встраивание PDB как ресурса в .EXE. Однако это должен быть шаг после сборки, так как они создаются одновременно. И есть вероятность аннулирования частей PDB, если вы измените EXE после его сборки.

Есть ли конкретная причина, по которой вы пытаетесь это сделать? Я предполагаю, что это в конечном итоге вызовет у вас много боли, так как 1) он не поддерживает AFAIK и 2) цепочка инструментов направлена ​​на поиск PDB в том же каталоге, а не в .EXE. Поначалу развертывание двух файлов немного раздражает, но на данный момент это так.

0 голосов
/ 27 августа 2010

Я почти уверен, что PDB всегда были автономными файлами.Раньше в VC ++ был переключатель, который заставлял бы его испускать (ограниченный по сравнению с PDB) символьную информацию в файл «CodeView» .DBG, который по умолчанию был встроен в EXE.Однако этот параметр больше не поддерживается в более новых (после 6.x?) Версиях компилятора.

...