我试图弄清楚在 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 的人已经这样做了,但我想知道它是如何完成的。