PDB 与 .exe 不匹配
Posted
技术标签:
【中文标题】PDB 与 .exe 不匹配【英文标题】:PDB doesn't match .exe 【发布时间】:2017-11-23 12:40:53 【问题描述】:我在我的 C++ 应用程序上使用 VS2015 调试器。当我启动应用程序时,调试器会给出消息
Loaded 'C:\MyDir\Working\x64\Debug\MyApp.exe'. Cannot find or open the PDB file
因此,我无法设置断点。
根据 VS 调试器和 WidDBG Symchk,在与 .exe 相同的目录中有一个 .pdb 文件,但它不匹配。 Symchk 没有提供不匹配的原因,即使使用 /v 选项也是如此。
完全重建不会让这个问题消失。它仅发生在调试版本中,并且今天才开始。在今天之前,不匹配的 pdb 没有问题,无论是用于调试还是发布版本。
我使用的 VS 选项是:
C++:调试信息格式=程序数据库(/Zi),程序数据库文件名=$(IntDir)%(Filename).pdb; 链接器:生成调试信息=优化调试 (/DEBUG),生成程序数据库文件=$(OutDir)MyApp.pdb,生成完整程序数据库文件=是。各个对象的 pdb 文件出现在中间目录中,MyApp.pdb 与 MyApp.exe 一起出现在输出目录中。
现在,奇怪的部分是:当删除现有的 MyApp.pdb 然后重新链接时,输出目录中会出现一个新的 .pdb 文件,其中包含当前的 mod 时间。当链接器运行时,pdb 文件变大(~70 MB),但随着链接器完成,pdb 文件突然变小(~4 MB),并且 mod 时间更改为今天提前几个小时。这是非常可疑的,可能是 pdb 不匹配的原因。
链接器的最终输出行是
Finished searching libraries
MyApp.vcxproj -> C:\MyDir\Working\x64\Debug\MyApp.exe
MyApp.vcxproj -> C:\MyDir\Working\x64\Debug\\MyApp.pdb (Full PDB)
如何强制 VS 为调试构建生成匹配且正确的 pdb 文件?
【问题讨论】:
【参考方案1】:更新:问题是在中间目录中创建了一个pdb文件MyApp.pdb(它是编译器为MyApp.cpp创建的pdb文件)。出于某种原因,链接器最后用这个文件替换了“真正的”pdb 文件。由于它们具有相同的名称 MyApp.pdb,Symchk 不会显示名称不匹配(尽管可能存在不明显的时间戳不匹配)。
MyApp.cpp 的调试信息如何包含在最终的 MyApp.pdb 中并不明显。
【讨论】:
以上是关于PDB 与 .exe 不匹配的主要内容,如果未能解决你的问题,请参考以下文章