Entwickler-Ecke

Sonstiges (Delphi) - Information der/des aufrufenden Methode/Ortes auslesen


MitschL - Do 17.02.05 12:35
Titel: Information der/des aufrufenden Methode/Ortes auslesen
Also,

ich habe gerade eine LogFile-Unit erstellt. Die Aufrufe geschehen nach dem Motto:

Delphi-Quelltext
1:
2:
3:
ILog( 'Info-Text' );
WLog( 'Warn-Text' );
ELog( 'Fehler-Text' );


Jetzt möchte ich gern noch Informationen des aufrufenden Ortes mit übergeben, so daß in meinem Logfile die Unit und Methode auftauchen, ohne dies explizit im Text angeben zu müssen. Wie kann ich das machen? Geht es überhaupt?

Ein Antwort würde mich erfreuen.

gegrüßt!


delfiphan - Do 17.02.05 13:08

Ist das ganze nur für Testzwecke gedacht? Falls ja, kannst du dir was mit Assertions basteln. Sobald du die Assertions nicht mehr brauchst, kannst du dann einfach die Assertions ausschalten und sie werden automatisch nicht mehr mitkompiliert.
Was anderes fällt mir momentan nicht ein.
Gruss,
Simon


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
{$ASSERTIONS ON}
procedure MyAssertErrorProc(const Message, Filename: string; LineNumber: Integer; ErrorAddr: Pointer);
begin
 ShowMessage('"'+Message+'": in '+Filename+' at '+inttostr(LineNumber));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 AssertErrorProc := MyAssertErrorProc;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 assert(false,'Fehler-Text');
end;


MitschL - Do 17.02.05 13:42

Erstmal ein Danke,

ich hab mir das mal angeschaut und mußte leider feststellen, daß mich das Erstens nicht so ganz zufrieden stellt - Ich möchte nämlich gern den Methoden-Namen haben - und dass das Logfile auch in einer Auslieferung enthalten sein soll (Es hat eine Debug/Release-Unterscheidung), was Assertions als 'unglücklich' einstuft.

Hm. Ich bin wohl TCL- und C++-verwöhnt...

gegrüßt!


delfiphan - Do 17.02.05 14:53

Wie gesagt, was besseres fällt mir nicht ein.
So weit ich weiss (könnte mich aber täuschen) werden nur die Namen der published-Methoden überhaupt mitgespeichert.

Gruss


opfer.der.genauigkeit - Do 17.02.05 15:48

Meinst du z.B. eine Funktion wie ptrace (Linux- Kernel- Funktion)
mit der du den Aufrufstack zurückverfolgen kannst?


MitschL - Do 17.02.05 16:17

ptrace sagt mir nichts :oops:
Aufrufstack hingegen schon eher, wie komme ich da an den letzten also ersten.. ähm obersten Eintrag? Der wäre genau, was ich haben möchte.

gegrüßt!


opfer.der.genauigkeit - Do 17.02.05 16:31

Ich hab auch mal n bißchen nach einer vergleichbaren Funktion von Windows gesucht..
erfolglos bis jetzt. Hab nur das gefunden und grad keine Zeit mehr mich darum zu kümmern
StackWalk

Was du machen kannst ist dir mal im Delphi- Assemblerfenster anzusehen, wie die Aufrufe von statten gehen
und wie man so sinnvoll und allgemeingültig an den vorherigen Aufruf kommt.
Aber hier sollten sich mal die Assemblerkönner einschalten, mich würde das auch interessieren. :wink:

//Edit: Und guck mal hier http://support.microsoft.com/default.aspx?scid=kb;en-us;92537


MitschL - Do 17.02.05 17:22

Erstmal: hab Dank,

ich habe mal den Artikel hinter dem Link überflogen und kam zu dem Schluß, daß ich wohl eine Prozeduren-Symbol-Liste haben/pflegen müßte.
Dann sah ich mir StackWalk an und scheiterte an einem Pointer auf den StackFrame.
Zu guter Letzt startete ich ein Programm aus der Idee, unterbrach es und sah mir das CPU-Fenster an. OK. Assembler ist bei mir 12 Jahre und einen anderen Typ Computer (c64) her.
Also: Erfolglos...

gegrüßt


delfiphan - Do 17.02.05 23:36

Vielleicht lohnt es sich ja hier mal reinzuschauen:
http://www.clevercomponents.com/articles/article012/exwatcher.asp
Gruss