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
[...]
) 涉及堆栈跟踪,调试器仍然抱怨。如果我为它提供正确的二进制搜索路径,那么我会得到正确的调用堆栈。
我的问题是:
- 尽管时间戳就在转储中,但 windbg 抱怨它们丢失了。为什么?
- 我认为 PDB 与比较 GUID 和所谓年龄的二进制文件相匹配。为什么 windbg 拒绝加载符号,将其归咎于缺少它实际拥有但不需要的信息? :)
我的windbg版本是10.0.10240.9
我假设展开信息存在于 PDB 文件中。我错了,它不是(默认情况下)。然而,事实证明有一个链接器开关指示链接器将展开数据复制到 PDB:/DEBUGTYPE:PDATA
您需要做的就是将 /DEBUGTYPE:CV,PDATA
添加到您的链接器开关(根据 documentation,/DEBUGTYPE:CV
是使用 /DEBUG
编译的用户模式程序的默认值).
在此之后,windbg 在执行堆栈遍历时没有问题,即使缺少二进制文件(确保 !sym noisy
和 lmvm
确实找不到二进制文件)。不幸的是,这在 Visual Studio 中不起作用(尝试使用 2015 更新 3)。
我在 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
[...]
) 涉及堆栈跟踪,调试器仍然抱怨。如果我为它提供正确的二进制搜索路径,那么我会得到正确的调用堆栈。
我的问题是:
- 尽管时间戳就在转储中,但 windbg 抱怨它们丢失了。为什么?
- 我认为 PDB 与比较 GUID 和所谓年龄的二进制文件相匹配。为什么 windbg 拒绝加载符号,将其归咎于缺少它实际拥有但不需要的信息? :)
我的windbg版本是10.0.10240.9
我假设展开信息存在于 PDB 文件中。我错了,它不是(默认情况下)。然而,事实证明有一个链接器开关指示链接器将展开数据复制到 PDB:/DEBUGTYPE:PDATA
您需要做的就是将 /DEBUGTYPE:CV,PDATA
添加到您的链接器开关(根据 documentation,/DEBUGTYPE:CV
是使用 /DEBUG
编译的用户模式程序的默认值).
在此之后,windbg 在执行堆栈遍历时没有问题,即使缺少二进制文件(确保 !sym noisy
和 lmvm
确实找不到二进制文件)。不幸的是,这在 Visual Studio 中不起作用(尝试使用 2015 更新 3)。