什么原因导致符号无法从PDB文件加载?

时间:2013-01-24 00:06:26

标签: visual-studio pdb-files

  • 第1步:构建myProgram.exe并生成myProgram.pdb。
  • 第2步:我故意导致myProgram.exe崩溃。
  • 第3步:我被问到是否要将Visual Studio用作调试器,我这样做。
  • 步骤4:Visual Studio加载myProgram.pdb中的符号。
  • 步骤5:检查调用堆栈以识别发生崩溃的(已知)位置。
  • 第6步:我不皱眉或看起来很困惑,因为这应该是这样的。

但是,如果我将myProgram.exe和myProgram.pdb重命名为SomethingElse.exe和SomethingElse.pdb并重复这些步骤,则结果将从步骤4开始混合。据我所知,在我的构建机器上,VS将始终从重命名的PDB文件中成功加载符号。但是,在我的远程目标机器上,VS永远不会加载符号 - 它总是告诉我PDB文件与可执行文件不匹配。为什么不?我打破了一条晦涩难懂的规则吗?我在任何地方都运行Visual Studio 2005,以防万一。

2 个答案:

答案 0 :(得分:2)

这里简单的细微规则是PDB文件名似乎被编码到EXE文件中,而不是从EXE文件名派生。因此,例如,如果您在Windows资源管理器中通过简单的复制和粘贴创建“myProgram.exe的副本”和“myProgram.pdb的副本”,则可能会显示尽管名称发生更改,仍会加载符号。但只有原来的“myProgram.pdb”文件也存在才会起作用 - 如果删除“myProgram.pdb”并且只有“myProgram.pdb的副本”,则符号可能兼容,但Visual Studio不会甚至尝试加载它们。

在我办公室的远程计算机上进行快速和肮脏的测试时,所有更改的都是文件名,而不是文件版本,而在实际的远程计算机上,名称和文件版本都不同,所以它是永远不可能让事情看起来有效。

答案 1 :(得分:0)

如果我的中间目录是输出目录的子目录,Visual Studio 2013 Update 5会为我创建损坏的[1] PDB。我要解决此问题的差异

-    <IntDir>$(OutDir)/$(TargetName)/</IntDir>
+    <IntDir>$(OutDir)</IntDir>

[1]已验证与windbg的!itoldyouso

不匹配