我正在尝试一种分析工具,可以在Windows中分析带有嵌入式调试符号信息的可执行文件。在几个开源项目上尝试这个工具时,我意识到大多数构建都没有将符号信息保存在可执行文件中。我能够使用VS(2008)编译源代码,但构建通常将调试信息保存在单独的.pdb文件中,而不是.exe文件中(遗憾的是我只想从.exe文件中读取调试信息而不是.pdb文件: - ()。
有人知道使用Visual Studio将符号调试信息嵌入单个.exe文件的方法吗?
答案 0 :(得分:6)
我知道这是一个相当古老的问题但是这个功能最近已合并到Roslyn中:https://github.com/dotnet/roslyn/issues/12390
答案 1 :(得分:5)
我还不知道该怎么做 - 但MSDN上有关于它的文章。
便携式可执行文件(即.exe
或.dll
)可以有flag present in the header:(archive)
IMAGE_FILE_DEBUG_STRIPPED
调试信息已被删除并单独存储,并单独存储在.dbg文件中。
这意味着调试信息可以 可执行文件,并且选项被删除并存储在单独的{{1文件。
From MSDN article DBG Files:(archive)
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
下一步,回答我们问题的部分是:
但答案“它无法完成”似乎是不正确的。
答案 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?)版本的编译器中似乎不再支持该开关。