2017-06-20 88 views
2

我在我的C++应用程序上使用VS2015调试器。当我启动应用程序时,调试器给出消息PDB不匹配.exe

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)%(文件名).PDB;
  • 链接器:生成调试信息=优化调试(/ DEBUG),生成程序数据库文件= $(OutDir)MyApp.pdb,生成完整的程序数据库文件=是。

单个对象的pdb文件出现在中间目录中,MyApp.pdb和MyApp.exe一起出现在输出目录中。

现在,这里是一个奇怪的部分:当删除现有的MyApp.pdb然后重新链接时,新的.pdb文件出现在当前mod时间的输出目录中。链接器运行时,pdb文件会变大(〜70 MB),但当链接器完成时,pdb文件会突然变小(〜4 MB),并且mod时间现在会在几个小时之前更改。这是非常可疑的,可能会导致pdb不匹配。

链接器的最终输出线

我怎么能强迫VS产生的调试版本匹配和正确的PDB文件?

回答

3

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

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