4
  • 第 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,以防万一。

4

2 回答 2

3

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

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

于 2013-01-24T23:05:20.413 回答
0

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

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

[1] 已验证与 windbg 的不匹配!itoldyouso

于 2019-04-25T20:07:03.307 回答