![]() |
Rücksprungadresse ermitteln
Ich habe folgende Methode und möchte gerne die Rücksprungadresse wissen, damit der Debugger genau an der richtigen Stelle
anhält.
Delphi-Quellcode:
Zusatzfrage:
procedure TKlasseXY.SetError(const errormessage:string);
var addr : Pointer; begin addr := ?; raise Exception.CreateFmt('Fehler in KlasseXY: %s', [errormessage]) at addr; end; Ich habe folgende Zeile im Sourcecode von Delphi 2007 gesehen:
Delphi-Quellcode:
Kann das sein, dass CallerAddr durch den Compiler zur Verfügung gestellt wird?
raise ETestFailure.Create(ModMsg) at CallerAddr;
Und falls ja, aber welcher Version gibt es das? |
Re: Rücksprungadresse ermitteln
Das geht meines Wissens nur mit Inline-Assembler. Und da gibt es auch zwei verschiedene Varianten, je nachdem, ob der Compiler einen Stackframe emittiert.
Mit Stackframe:
Delphi-Quellcode:
Ohne Stackframe:
asm
mov eax, [ebp+4] mov Addr, eax end;
Delphi-Quellcode:
Problematisch wird es, wenn der Compiler Addr in einem der Register esi, edi oder ebx ablegt - dann funktioniert keine der obigen Möglichkeiten ohne Änderung. Um sicher zu gehen gibt es zwei Möglichkeiten:
asm
mov eax, [esp] mov Addr, eax end; 1. Optimierung vor der Routine abschalten {$O-} und die Variante mit Stackframe verwenden. 2. Eine Hilfsroutine verwenden:
Delphi-Quellcode:
procedure InternalRaiseException(const ErrorMessage: string; ErrorAddr: Pointer);
begin raise Exception.CreateFmt('Fehler in KlasseXY: %s', [errormessage]) at addr; end; procedure TKlasseXY.SetError(const errormessage:string); asm mov edx, [esp] call InternalRaiseException end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz