将.pdb调试符号信息嵌入到Visual Studio中的.exe文件中

Anh*_*ong 10 executable debug-symbols visual-studio pdb-files

我正在尝试一种分析工具,可以在Windows中分析带有嵌入式调试符号信息的可执行文件.在几个开源项目上尝试这个工具时,我意识到大多数构建都没有将符号信息保存在可执行文件中.我能够使用VS(2008)编译源代码,但构建通常将调试信息保存在单独的.pdb文件中,而不是.exe文件中(遗憾的是我只想从.exe文件中读取调试信息而不是.pdb文件:-().

有没有人知道使用Visual Studio将符号调试信息嵌入单个.exe文件的方法?

Sha*_*sky 6

我知道这是一个相当古老的问题但是这个功能最近被合并到了Roslyn:https://github.com/dotnet/roslyn/issues/12390


Ian*_*oyd 5

我还不知道怎么做 - 但MSDN上有关于它的文章.

可移植可执行(即.exe.dll)可以具有存在于头标志:(存档)

IMAGE_FILE_DEBUG_STRIPPED
Run Code Online (Sandbox Code Playgroud)

调试信息已删除并单独存储在.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
Run Code Online (Sandbox Code Playgroud)

下一步,以及回答我们问题的部分是:

  • 嵌入式调试信息的格式是什么?
  • 其中,在PE存储嵌入式调试信息?(资源?,数据部分?)

但答案"它无法完成"似乎是不正确的.

也可以看看


小智 5

MSDN说,这是不可能的.

无法创建包含调试信息的.exe或.dll.调试信息始终放在.pdb文件中.


Jar*_*Par 1

Visual Studio 中没有对此类操作的内置支持(至少对于托管语言而言)。.PDB 和 .EXE 文件是同时创建的,并且没有嵌入选项。我什至不确定 .EXE 格式是否支持嵌入 PDB 符号,尽管我在这一点上可能是错的。

我能看到的唯一方法是将 PDB 作为资源嵌入到 .EXE 中。然而,这必须是构建后步骤,因为两者是同时构建的。如果您在构建 EXE 后对其进行修改,则可能会导致 PDB 的某些部分无效。

您尝试这样做有什么特殊原因吗?我想它最终会给你带来很多痛苦,因为 1)据我所知它不受支持,2)工具链旨在在同一目录中而不是在 .EXE 中查找 PDB。部署 2 个文件一开始有点烦人,但现在就是这样完成的。