我在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。
我的问题是:
我的windbg版本是10.0.10240.9
答案 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)。