![]() |
Adresse einer Funktion ermitteln
Hallo zusammen,
ich möchte gerne die Adresse einer Prozedur ermitteln. Diese möchte ich dann in den IDE Dialog Laufzeitfehler suchen eingeben um an die entsprechende Quellcodezeile springen zu können. Derzeit mache ich das so (exemplarisch)
Delphi-Quellcode:
Den Assembler Part möchte ich nicht in jeder Funktion der TDummy Klasse wiederholen. Ich würde mir eine Funktion GetAddress wünschen.procedure TDummy.Procedure1(); var Address: Pointer; begin asm mov eax, [ebp+04] dec eax mov [Address], eax end; Address ausgeben; end; procedure TDummy.Procedure2(); var Address: Pointer; begin asm mov eax, [ebp+04] dec eax mov [Address], eax end; Address ausgeben; end; procedure TForm1.Button1Click(Sender: TObject) begin Dummy.MyProcedure1; -> hier soll Laufzeitfehler suchen hinspringen bei Procedure1 Dummy.MyProcedure2; -> entsprechend hier bei Procedure2 end;
Delphi-Quellcode:
Die 3 Zeilen Assembler habe ich in mühseliger Kleinarbeit im CPU Fenster abgeguckt, für mein Vorhaben mit der Funktion GetAddress reichen meine Kenntnisse aber offensichlich nicht aus. Ich hoffe jemand von euch kann mir da weiterhelfen.function TDummy.GetAddress: Pointer; begin asm ???? end; end; procedure TDummy.MyProcedure1; var Address: Pointer; begin Address := GetAddress; Address ausgeben end; procedure TForm1.Button1Click(Sender: TObject) begin Dummy.MyProcedure1; end; VG Arno |
Re: Adresse einer Funktion ermitteln
Soweit ich weiß kannst du dir die Adresse einer Methode einfach mit @@Methode holen. Mit Assembler kommst du ohne viel Arbeit nur auf die Adresse des Bytes, das deine GetAddress-Funktion aufgerufen hat..
|
Re: Adresse einer Funktion ermitteln
Hallo Dax,
der Titel ist ein wenig irreführend. Ich möchte nicht die Adresse der Funktion oder Prozedur, sondern ich möchte das die neue Funktion GetAddress die Adresse des Aufrufs des Aufrufers von GetAddress ermittelt. Sorry, ich weiß nicht wie ich es anders formulieren soll ... - Arno |
Re: Adresse einer Funktion ermitteln
Ach soooo :) Na das dürfte so gehen:
Delphi-Quellcode:
Oder [esp-4]... Die Details hab ich vergessen...
function GetCallingAddress: Cardinal;
asm mov eax, [esp+4] end; |
Re: Adresse einer Funktion ermitteln
Liste der Anhänge anzeigen (Anzahl: 3)
Ne, das klappt nicht :-(
Ich habe mal ein Beispiel Projekt erstellt. |
Re: Adresse einer Funktion ermitteln
Oha :) Da hab ich nicht im Vorzeichen, sondern in der 4 geirrt.
Delphi-Quellcode:
So geht es wirklich :)
function GetCallingAddress: Cardinal;
asm mov eax, [esp] end; edit: :oops: Da hab ich wohl nicht nur den Titel, sondern auch die Erklärung dessen missverstanden. noch eins:
Delphi-Quellcode:
Das geht jetzt aber wirklich..
function GetCallingAddress: Pointer;
asm mov eax, [eax] mov eax, [ebp+04] dec eax end; |
Re: Adresse einer Funktion ermitteln
Ähm Dax, hast Du mein Beispiel Projekt ausprobiert?
Delphi-Quellcode:
-
procedure TForm1.Button1Click(Sender: TObject);
var p: Pointer; begin FDummy.Procedure1; // <- Hier möchte ich hin ;-) end; {snip} procedure TDummy.Procedure1; var Address: Cardinal; begin Address := GetCallingAddress; // <- Bei Deinem Vorschlag landen wir hier {snip} end; arno |
Re: Adresse einer Funktion ermitteln
Ja, aber erst im Nachhinein.. Das war ein Fehler :wall:
Die Funktion aus dem Edit liefert aber den gleichen Wert wie dein Assembler-Schnipsel :) |
Re: Adresse einer Funktion ermitteln
Jawoll, jetzt klappt es. Schonmal vielen herzlichen Dank :-D
Aber ich verstehe den Code nicht :oops: Kannst Du bitte noch ein paar erklärende Zeilen schreiben? |
Re: Adresse einer Funktion ermitteln
Leider nicht, ich hab nur deinem Code noch eine Indirektionsebene (zum nächsten Caller) hinzugefügt.. Irgendwann wird das aber zwangsläufig schiefgehen, da Delphi nicht bei jeder Funktion den Stackpointer sichert ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:08 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