PDB与.exe不匹配

时间:2017-06-20 20:02:54

标签: c++ visual-studio pdb-files

我在我的C ++应用程序上使用VS2015调试器。当我启动应用程序时,调试器会给出消息

Loaded 'C:\MyDir\Working\x64\Debug\MyApp.exe'. Cannot find or open the PDB file

因此,我无法设置断点。

与.exe相同的目录中有.pdb文件,但根据VS调试器和WidDBG Symchk,它不匹配。即使使用/ v选项,Symchk也不会提供不匹配的原因。

完全重建不会使这个问题消失。它只发生在调试版本中,它刚刚开始。在今天之前,对于调试或发布版本,pdb不匹配没有问题。

我使用的VS选项是:

  • C ++:Debug Information Format = Program Database(/ Zi),Program Database File Name = $(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 个答案:

答案 0 :(得分:3)

更新:问题是在中间目录中创建了一个pdb文件MyApp.pdb(它是由编译器为MyApp.cpp创建的pdb文件)。出于某种原因,链接器最后用这个替换了“真正的”pdb文件。由于它们具有相同的名称,MyApp.pdb,Symchk不会显示名称不匹配(尽管可能存在时间戳不匹配,但不明显)。

MyApp.cpp的调试信息如何包含在最终的MyApp.pdb中并不明显。