Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Name der Procedure rausfinden


christianrein - Di 03.02.09 12:36
Titel: Name der Procedure rausfinden
Hallo,

ich suche nun schon seit ein paar Tagen nach einer Lösung, und zwar suche ich eine Funktion mit der ich den Namen der aufrufenden Procedure rausfinden kann. Also z.B.:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure log(text : string);
begin
  showmessage("aufrufendeprocedure" + text);
end;

procedure irgendwas();
begin
  log('Es ist ein Fehler aufgetreten');
end;


Ich benötige das ganze um ein anstendiges Log Module für meine Anwendung zu schreiben und möchte nicht jedesmal den Namen händisch eintragen müssen.

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt


jaenicke - Di 03.02.09 15:03

Hallo und :welcome: im Forum!

Ich glaube da wirst du nicht drum herumkommen. Der Grund ist einfach: Die Namen der Prozeduren werden beim Kompilieren durch ihre Adressen ersetzt und sind (zumindest ohne Debuginformationen) nicht mehr in der Exe enthalten.

Du könntest also höchstens diesen Zahlenwert loggen, müsstest dann aber jedesmal erst die zugehörige Prozedur heraussuchen, wenn du deren Namen brauchst. Diesen Wert müsstest du via Assembler relativ einfach bekommen, denn der steht ja im Aufrufstack (direkt aus der Logprozedur heraus meine ich kannst du den dann bekommen).


JayEff - Di 03.02.09 15:10

Du könntest diesen Source nutzen: http://www.delphi-forum.de/viewtopic.php?t=18577
Da musst du zwar die Prozedurennamen auch von Hand eintragen, aber es nimmt dir schonmal ein bisschen Arbeit ab :zustimm:


christianrein - Di 03.02.09 15:24

Doch noch eine Frage, wie kann ich denn die Addresse von der Prozedur bekommen ? Damit wäre mir auch schon geholfen. Danke


Hmm schade, ich dachte das man da vielleicht was mit methodname(methodaddress('')); machen kann. Wobei ich dann wieder bei MethodAddress den Prozedurenamen als String angeben muss. Na ja dann werde ich mir wohl doch die Arbeit machen müssen. Aber trotzdem Vielen Dank.


jaenicke - Di 03.02.09 15:39

user profile iconchristianrein hat folgendes geschrieben Zum zitierten Posting springen:
Hmm schade, ich dachte das man da vielleicht was mit methodname(methodaddress('')); machen kann. Wobei ich dann wieder bei MethodAddress den Prozedurenamen als String angeben muss.
Wenn du das so ähnlich machen willst, dann kannst du wie gesagt die Adressen auslesen. Du könntest dann die Adressen aller Methoden manuell in die Liste eintragen, müsstest das aber nur an einer Stelle machen. Dort übersetzt du dann die Adresse in den Namen.

user profile iconchristianrein hat folgendes geschrieben Zum zitierten Posting springen:
Doch noch eine Frage, wie kann ich denn die Addresse von der Prozedur bekommen ? Damit wäre mir auch schon geholfen.
Schau dir einmal die Seite an:
http://www.clevercomponents.com/articles/article012/exwatcher.asp
Ohne die Debuginformationen kommst du zwar auch dort nicht an die Namen direkt heran, aber du siehst dort wie du den Aufrufstack auslesen kannst und auch wie du die Namen dazu bekommst, wenn du mit Debuginformationen kompilierst.
Hier findest du auch etwas bei MS selbst:
http://msdn.microsoft.com/en-us/library/ms680650.aspx


Delete - Di 03.02.09 17:40

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconchristianrein hat folgendes geschrieben Zum zitierten Posting springen:
Hmm schade, ich dachte das man da vielleicht was mit methodname(methodaddress('')); machen kann. Wobei ich dann wieder bei MethodAddress den Prozedurenamen als String angeben muss.
Wenn du das so ähnlich machen willst, dann kannst du wie gesagt die Adressen auslesen. Du könntest dann die Adressen aller Methoden manuell in die Liste eintragen, müsstest das aber nur an einer Stelle machen. Dort übersetzt du dann die Adresse in den Namen.

Und die Tabelle darf er bei jeder Änderung im Quelltrext anpassen.


jaenicke - Di 03.02.09 18:21

user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Und die Tabelle darf er bei jeder Änderung im Quelltrext anpassen.
Warum das? :shock: Das kann das Programm doch selbst tun. Man muss ja nur die entsprechenden Methoden in die Liste schreiben. Deren Adressen findet das Programm doch alleine.


Boldar - Di 03.02.09 19:21

mir fällt gerade noch was ein: in einer dll werden prozeduren doch auch über ihre namen definiert.
Ich meine, ich hatte mal irgendwo ein Beispiel gesehen, wo eine Exe auch proceduren exportierte, und diese aus einer Kopie seiner selbst geladen hat (für einen globalen Hook).
Villeicht lässt sich ja in dieser Hinsich was machen...


BenBE - Di 03.02.09 23:32

Siehe Omorphia Debug Interface. Gibt's bei Sourceforge als Teil des Projekt Omorphia. Ist zwar nicht ganz einfach einzubinden, damit kann man das aber problemlos realisieren. Benötigt die Debug-Infos extern; damit kann man das aber wenn nötig von der EXE getrennt weitergeben. Mehr Infos gibt's auch, wenn Du hier im Forum mal nach OmMAP suchst.