【问题标题】:What causes symbols not to load from a PDB file?是什么导致符号无法从 PDB 文件加载?
【发布时间】:2013-01-24 00:06:25
【问题描述】:
  • 第 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,以防万一。

【问题讨论】:

  • 我刚刚在另一台“远程”机器(在我的办公室)上进行了测试,但没有出现这种情况。显然,实际的远程机器有一些特定的东西……它没有联网,除了生产时间之外很难访问。所以我想我正在寻找可能导致这些文件的简单名称更改以使其 PDB 无法使用的提示。如果新版本有问题,工作人员会恢复为重命名的可执行文件……我会失去符号支持,从而更难找到那里的问题。它变得非常烦人:-(
  • 这可能是一个愚蠢的问题,但是为什么不更改程序集名称而不是之后更改文件名呢?无论如何,这是一种奇怪的行为。
  • 我在创建新版本时重命名文件 - 我将副本保存为“myProgram [date].exe”,以备需要恢复时使用。但最近,由于未处理的异常,工作人员一直在恢复使用这些重命名的文件。这种奇怪的行为使跟踪这些异常变得更加困难。

标签: visual-studio pdb-files


【解决方案1】:

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

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

【讨论】:

  • 我有一种情况,即使程序集和 PDB 文件的名称和位置与构建时相同,PDB 文件也不可用。但是,它们被移动到另一台机器上,但所有文件位置都与开发机器上的相同。尽管如此,Visual Studio 并不认为 PDB 文件与程序集匹配。有什么想法吗?
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 2011-04-23
    • 2018-03-09
    • 1970-01-01
    • 2010-09-06
    相关资源
    最近更新 更多