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

时间:2015-10-11 19:18:41

标签: debugging windbg stack-trace symbols

我在windbg中打开一个特定的崩溃转储,设置符号路径,加载异常记录,并使用program Naturalnumbers; var x: integer; const Answ: array [False .. True] of string = ('No', 'Yes'); begin writeln(' is the inserted number a square of a natural number? '); readln(x); write(Answ[trunc(sqrt(x)) = sqrt(x)]); readln end; 生成堆栈遍历。我得到一个错误的调用堆栈,即使我知道符号匹配。

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

  

时间戳丢失,无法访问或等于零。

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

T

)参与了堆栈跟踪,调试器仍然抱怨。如果我给它一个正确的二进制搜索路径,那么我得到一个正确的callstack。

我的问题是:

  1. 尽管时间戳正好在转储中,但windbg抱怨他们失踪了。为什么?
  2. 我认为PDB与比较GUID和所谓年龄的二进制文件相匹配。为什么windbg拒绝加载符号,指责它实际上缺少的信息,而不需要? :)
  3. 我的windbg版本是10.0.10240.9

1 个答案:

答案 0 :(得分:0)

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

您需要做的就是将/DEBUGTYPE:CV添加到链接器开关(根据documentation/DEBUG是使用!sym noisy编译的用户模式程序的默认设置。

在此之后,windbg在堆栈行走时没有问题,即使丢失了二进制文件(确保lmvm#box-container { padding : 10px; border : 1px solid #f00; position: relative; } #box { display: inline-block; background : #fff; padding:50px; border: 1px solid #ddd; position: relative; left: 150px; } 确实找不到二进制文件)。不幸的是,这在Visual Studio中不起作用(尝试使用2015 Update 3)。