我正在试验一种分析工具,可以在 Windows 中分析带有嵌入式调试符号信息的可执行文件。在几个开源项目上尝试这个工具时,我意识到大多数构建不会将符号信息保留在可执行文件中。我可以使用 VS (2008) 编译源代码,但构建通常将调试信息保存在单独的 .pdb 文件中,而不是 .exe 文件中(不幸的是,我只想从 .exe 文件中读取调试信息而不是.pdb 文件:-()。
有人知道使用 Visual Studio 将符号调试信息嵌入单个 .exe 文件的方法吗?
我正在试验一种分析工具,可以在 Windows 中分析带有嵌入式调试符号信息的可执行文件。在几个开源项目上尝试这个工具时,我意识到大多数构建不会将符号信息保留在可执行文件中。我可以使用 VS (2008) 编译源代码,但构建通常将调试信息保存在单独的 .pdb 文件中,而不是 .exe 文件中(不幸的是,我只想从 .exe 文件中读取调试信息而不是.pdb 文件:-()。
有人知道使用 Visual Studio 将符号调试信息嵌入单个 .exe 文件的方法吗?
我知道这是一个很老的问题,但这个功能最近已合并到 Roslyn:https ://github.com/dotnet/roslyn/issues/12390
MSDN说这是不可能的。
无法创建包含调试信息的 .exe 或 .dll。调试信息始终放在 .pdb 文件中。
我还不知道该怎么做——但 MSDN 上有一篇文章谈到了它。
可移植的可执行文件(即或.exe
).dll
可以在标头中包含一个标志:(存档)
IMAGE_FILE_DEBUG_STRIPPED
调试信息已被删除并单独存储在 .dbg 文件中。
这意味着调试信息可以在可执行文件中,并且可以选择删除并存储在单独的.dbg
文件中。
来自 MSDN 文章DBG文件:(存档)
DBG 文件是可移植的可执行 (PE) 格式文件,其中包含 Visual Studio 调试器的 Codeview 格式的调试信息(可能还有其他格式,具体取决于 DBG 的创建方式)。当您没有某些代码的源代码(例如库或 Windows API)时,DBG 文件允许调试。DBG 文件还允许您进行 OLE RPC 调试。
DBG 文件已被 PDB 文件取代,后者现在更常用于调试。
您可以使用 REBASE.EXE 实用程序从 PE 格式的可执行文件中去除调试信息,并将其存储在 DBG 文件中。PE 文件头中的文件特征字段 IMAGE_FILE_DEBUG_STRIPPED 告诉调试器 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
下一步,以及可以回答我们问题的部分是:
但是“它做不到”的答案似乎是不正确的。
Visual Studio 中没有对此类操作的内置支持(至少对于托管语言)。.PDB 和 .EXE 文件是同时创建的,没有嵌入选项。我什至不确定 .EXE 格式是否支持嵌入 PDB 符号,尽管我在这一点上可能是错误的。
我能看到的唯一课程是将 PDB 作为资源嵌入到 .EXE 中。但是,这必须是后期构建步骤,因为两者是同时构建的。如果您在构建 EXE 后对其进行修改,则可能会使 PDB 的某些部分失效。
您尝试这样做有什么特别的原因吗?我想象它最终会给你带来很多痛苦,因为 1)它不支持 AFAIK 和 2)工具链适用于在同一目录中而不是 .EXE 中查找 PDB。部署 2 个文件一开始有点烦人,但现在它是如何完成的。
我很确定 PDB 始终是独立文件。VC++ 曾经有一个开关,它会导致它发出(与 PDB 相比有限)符号信息到默认情况下嵌入在 EXE 中的“CodeView”.DBG 文件。但是,在较新的(6.x 后?)版本的编译器中似乎不再支持该开关。