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

时间:2010-08-26 16:01:52

标签: visual-studio executable debug-symbols pdb-files

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

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

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

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

便携式可执行文件(即.exe.dll)可以有flag present in the headerarchive

IMAGE_FILE_DEBUG_STRIPPED
     

调试信息已被删除并单独存储,并单独存储在.dbg文件中。

这意味着调试信息可以 可执行文件,并且选项被删除并存储在单独的{{1文件。

From MSDN article DBG Filesarchive

  

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格式的知识库文章提到了.dbg实用程序,它是dumpbin选项:

/SYMBOLS

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

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

但答案“它无法完成”似乎是不正确的。

另见

答案 2 :(得分:5)

MSDN说这是不可能的。

  

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

答案 3 :(得分:2)

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

我能看到的唯一课程是将PDB作为资源嵌入到.EXE中。然而,这必须是一个后期构建步骤,因为这两个步骤是同时构建的。如果在构建EXE之后修改EXE,则可能会使PDB的某些部分无效。

你有没有特别的理由这样做?我想象它最终会给你带来很大的痛苦1)它不支持AFAIK和2)工具链适合在不在.EXE内的同一目录中查找PDB。部署2个文件起初有点烦人,但它就是这样做的。

答案 4 :(得分:0)

我非常确定PDB始终是独立文件。 VC ++曾经有一个开关,它会使它发出(限制与PDB相比)符号信息到“CodeView”.DBG文件,默认情况下嵌入在EXE中。但是,在较新的(post 6.x?)版本的编译器中似乎不再支持该开关。