Ich versuche herauszufinden, wie eine Stack-Trace erhalten, nachdem eine Ausnahme in Delphi geworfen wird. Wenn ich jedoch versuche, den Stapel im Application.OnException-Ereignis mithilfe der Funktion unten zu lesen, scheint der Stapel bereits gelöscht zu werden und durch die Wurftechniken ersetzt zu werden.Delphi erhalten Stack-Trace nach Ausnahme
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;
Hier ist was für Ergebnisse Ich erhalte:
001A63E3: TApplication.HandleException (Forms)
00129072: StdWndProc (Classes)
001A60B0: TApplication.ProcessMessage (Forms)
Das ist offensichtlich nicht das, was ich suche, obwohl es korrekt ist. Ich möchte den Stapel so abrufen, wie er gerade war, bevor die Ausnahme ausgelöst wurde, oder mit anderen Worten, den Inhalt vor dem OnException-Aufruf.
Gibt es eine Möglichkeit, das zu tun?
Ich bin mir bewusst, dass ich das Rad neu erfinde, weil die Leute bei madExcept/Eurekalog/jclDebug dies bereits getan haben, aber ich würde gerne wissen, wie es gemacht wird.
Wie gut lesen Sie Assembler? ;-) –
Ich habe nie verstanden warum der RTL das nicht eingebaut hat ... –
@WarrenP: einigermaßen gut, oder zumindest gut genug, um das beheben zu können, dachte ich, aber ich habe kein Glück, wie es scheint . :( – Orwell