我正在尝试弄清楚在Delphi中抛出异常后如何获取堆栈跟踪。然而,当我在Application.OnException事件中使用以下函数读取堆栈时,堆栈似乎已经被刷新并由抛出异常的过程替换了。
function GetStackReport: AnsiString;
var
retaddr, walker: ^pointer;
begin
// ...
// History of stack, ignore esp frame
asm
mov walker, ebp
end;
// assume return address is present above ebp
while Cardinal(walker^) <> 0 do begin
retaddr := walker;
Inc(retaddr);
result := result + AddressInfo(Cardinal(retaddr^));
walker := walker^;
end;
end;
以下是我得到的结果类型:
001A63E3: TApplication.HandleException (Forms)
00129072: StdWndProc (Classes)
001A60B0: TApplication.ProcessMessage (Forms)
那显然不是我要找的,尽管它是正确的。 我想检索堆栈,就像异常抛出之前的状态一样,换句话说,在 OnException 调用之前(之后也可以)的内容。
有没有办法做到这一点?
我知道我正在重新发明轮子,因为 madExcept/Eurekalog/jclDebug 的人已经做过了,但我想知道它是如何实现的。