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 不匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何更改年龄不匹配的 PDB 以正确匹配?

如何将崩溃的“故障偏移”与源代码匹配?

故障转储 - WinDbg - 强制 PDB 文件匹配不起作用?

符号不匹配,ida/windbg

vs调试断点进不去的解决办法

VSTO加载项:清单中的引用与下载的程序集的标识不匹配