Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Rücksprungadresse ermitteln (https://www.delphipraxis.net/117140-ruecksprungadresse-ermitteln.html)

sx2008 12. Jul 2008 09:47


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:
procedure TKlasseXY.SetError(const errormessage:string);
var
  addr : Pointer;
begin
  addr := ?;
  raise Exception.CreateFmt('Fehler in KlasseXY: %s', [errormessage]) at addr;
end;
Zusatzfrage:
Ich habe folgende Zeile im Sourcecode von Delphi 2007 gesehen:
Delphi-Quellcode:
  raise ETestFailure.Create(ModMsg) at CallerAddr;
Kann das sein, dass CallerAddr durch den Compiler zur Verfügung gestellt wird?
Und falls ja, aber welcher Version gibt es das?

Apollonius 12. Jul 2008 10:06

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:
asm
mov eax, [ebp+4]
mov Addr, eax
end;
Ohne Stackframe:
Delphi-Quellcode:
asm
mov eax, [esp]
mov Addr, eax
end;
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:
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 17:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz