Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Adresse einer Funktion ermitteln (https://www.delphipraxis.net/94129-adresse-einer-funktion-ermitteln.html)

arnold mueller 16. Jun 2007 19:50


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:

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;
Den Assembler Part möchte ich nicht in jeder Funktion der TDummy Klasse wiederholen. Ich würde mir eine Funktion GetAddress wünschen.

Delphi-Quellcode:

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;
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.

VG
Arno

Dax 16. Jun 2007 19:54

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..

arnold mueller 16. Jun 2007 20:09

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

Dax 16. Jun 2007 20:11

Re: Adresse einer Funktion ermitteln
 
Ach soooo :) Na das dürfte so gehen:
Delphi-Quellcode:
function GetCallingAddress: Cardinal;
asm
  mov eax, [esp+4]
end;
Oder [esp-4]... Die Details hab ich vergessen...

arnold mueller 16. Jun 2007 20:30

Re: Adresse einer Funktion ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 3)
Ne, das klappt nicht :-(

Ich habe mal ein Beispiel Projekt erstellt.

Dax 16. Jun 2007 20:35

Re: Adresse einer Funktion ermitteln
 
Oha :) Da hab ich nicht im Vorzeichen, sondern in der 4 geirrt.
Delphi-Quellcode:
function GetCallingAddress: Cardinal;
asm
  mov eax, [esp]
end;
So geht es wirklich :)

edit: :oops: Da hab ich wohl nicht nur den Titel, sondern auch die Erklärung dessen missverstanden.

noch eins:
Delphi-Quellcode:
function GetCallingAddress: Pointer;
asm
    mov  eax, [eax]
    mov  eax, [ebp+04]
    dec  eax
end;
Das geht jetzt aber wirklich..

arnold mueller 16. Jun 2007 20:50

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

Dax 16. Jun 2007 20:53

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 :)

arnold mueller 16. Jun 2007 21:03

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?

Dax 16. Jun 2007 21:10

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 02:19 Uhr.
Seite 1 von 2  1 2      

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