Autor Beitrag
christianrein
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 03.02.09 12:36 
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.:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Di 03.02.09 15:10 
Du könntest diesen Source nutzen: 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 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
www.clevercomponents...cle012/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:
msdn.microsoft.com/e...ibrary/ms680650.aspx
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.