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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!