windbg 拒绝为转储加载符号(无法验证时间戳)

windbg refuses to load symbols for dump (Unable to verify timestamp)

我在 windbg 中打开一个特定的故障转储,设置符号路径,加载异常记录,并使用 k 生成堆栈遍历。我得到一个错误的调用堆栈,即使我知道这些符号确实匹配。

lmi 的输出充满了像 00007ff7'6f3c0000 00007ff7'743f0000 WhateverModule T (private pdb symbols) WhateverModule.dll 这样的行,请注意那里的 T。根据文档,这意味着:

The timestamp is missing, not accessible, or equal to zero.

这与 this answer 中描述的内容一致,实际上我没有指定二进制路径。即使转储似乎包含所有相关模块的所有时间戳(例如,lmDvmWhateverModule outputs

[...]
    Timestamp:        Mon Jun 15 13:18:45 2015 (557EB495)
    CheckSum:         04F8AF3B
[...]

) 涉及堆栈跟踪,调试器仍然抱怨。如果我为它提供正确的二进制搜索路径,那么我会得到正确的调用堆栈。

我的问题是:

  1. 尽管时间戳就在转储中,但 windbg 抱怨它们丢失了。为什么?
  2. 我认为 PDB 与比较 GUID 和所谓年龄的二进制文件相匹配。为什么 windbg 拒绝加载符号,将其归咎于缺少它实际拥有但不需要的信息? :)

我的windbg版本是10.0.10240.9

我假设展开信息存在于 PDB 文件中。我错了,它不是(默认情况下)。然而,事实证明有一个链接器开关指示链接器将展开数据复制到 PDB:/DEBUGTYPE:PDATA

您需要做的就是将 /DEBUGTYPE:CV,PDATA 添加到您的链接器开关(根据 documentation/DEBUGTYPE:CV 是使用 /DEBUG 编译的用户模式程序的默认值).

在此之后,windbg 在执行堆栈遍历时没有问题,即使缺少二进制文件(确保 !sym noisylmvm 确实找不到二进制文件)。不幸的是,这在 Visual Studio 中不起作用(尝试使用 2015 更新 3)。