Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Namen einen laufenden Prozedur abfragen?
jjturbo - Mi 19.12.07 12:32
Titel: Namen einen laufenden Prozedur abfragen?
Moin Forum,
kann man eigentlich den Namen einen laufenden Prozedur abfragen?
z.B.:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure MachIrgendwas; var prozedurname :String; begin prozedurname := ??? Showmessage(prozedurname); end; |
Narses - Mi 19.12.07 12:40
Titel: Re: Namen einen laufenden Prozedur abfragen?
Moin!
jjturbo hat folgendes geschrieben: |
kann man eigentlich den Namen einen laufenden Prozedur abfragen? |
Ja, z.B. so: :zwinker:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure MachIrgendwas; var prozedurname: String; begin prozedurname := 'MachIrgendwas'; Showmessage(prozedurname); end; |
cu
Narses
jjturbo - Mi 19.12.07 12:44
:lol:
Na so war´s net gemeint :wink:
Narses - Mi 19.12.07 13:38
Moin!
Klar ;) also im Ernst: Die Prozedurnamen sind nur zur Entwurfszeit bekannt und gehen beim Compilieren verloren (werden durch Adressen ersetzt). :idea:
Deshalb ist der Vorschlag oben wohl die einfachste Möglichkeit. :nixweiss: ich gehe mal davon aus, dass man Programme üblicherweise ohne Debuginfos ausliefert; sofern dich das nicht stört, hast du ja im Folgenden genug alternativen... *g*
cu
Narses
delfiphan - Mi 19.12.07 13:45
Ja es ist möglich. Es ist sogar möglich, den ganzen Call-Stack zur Laufzeit auszulesen. Jedi sollte sowas zur Verfügung stellen. Damit es klappt, müssen Debugging-Informationen aber mit eincompiliert werden.
Fürs Debugging reicht es aber meistens aus, mit Assert zu arbeiten. Damit erhältst du Source-File und Zeilennummer der jeweiligen Stelle.
Martin1966 - Mi 19.12.07 13:47
Sinnvoll wäre es hier den Verwendungszweck zu kennen. Also jjturbo? ;-)
jjturbo - Mi 19.12.07 13:55
Ich entwickle gerade eine Komponente zur automatischen Steuerung von Rollenbahnen. Damit auf der SPS-Ebene für die Standardanwendungen so gut wie nichts mehr dafür programmiert werden muß, muß das Ding einigermassen "Intelligent" sein.
Bestimmte Änderungen an diversen Eingangssignalen rufen bestimmte Prozeduren auf. Um sicher zu stellen, daß alles richtig verkabelt ist, gibt es einen Inbetriebnahmemodus.
Da dachte ich mir: Einfach ein Showmessage mit dem Prozedurnamen und gut. Und da ich einigermassen schreibfaul bin, stellte sich mir die Frage ob so was geht :wink:
delfiphan - Mi 19.12.07 14:07
Für schnelles Debugging reicht vielleicht das:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.Button1Click(Sender: TObject); begin Assert(false); end;
procedure MyAssert(const Message, Filename: string; LineNumber: Integer; ErrorAddr: Pointer); begin ShowMessage('Datei: '+FileName+#13#10+ 'Zeile: '+IntToStr(LineNumber)); end;
initialization AssertErrorProc := MyAssert; end. |
Ansonsten wie gesagt, siehe JclDebug.pas, Stack-Trace, Call-Stack.
hazard999 - Mi 19.12.07 14:09
Hallo,
ja das geht.
Ist nur etwas aufwendig.
Delphi-Quelltext
1: 2: 3: 4:
| function GetEbp : dword; asm mov eax, ebp end; |
Damit holen wir und mal den passenden Einsprungspunkt.
Der Datentyp sollte ein Array von Pointern sein.
Der zweite Pointer im Array sollte die passende Adresse sein.
Dann noch in TMethod casten und in MethodName() stecken.
Sollte das gewünschte Ergebnis sein.
Alternativ wäre auch MadExcept von MadShi eine Möglichkeit (
http://www.madshi.net).
StackTraces wären sicher interessanter als MethodName.
r u
René
PS: Linker-Adress-Map-File anhängen ist auch keine schlechte Idee.
jjturbo - Mi 19.12.07 20:16
hmm... :?
Hat jemand ein Beispiel mit Erklärung dafür?
hazard999 - Do 20.12.07 09:09
Hallo nochmal,
das einfachste ist sicher wenn du dir MadExcept besorgst.
uses madStackTrace;
showmessage(StackTrace(true,false,false,nil,nil,false,false));
Erzeugt einen sehr schönen Output (samt Zeilennummer wenn das Map-File in der binary enthalten ist).
Und 99$ für single developer oder 399 für site license ist ein Spotpreis.
Die 399$ hatten wir innerhalb von einem Monat wieder herrinnen.
r u
René
delfiphan - Do 20.12.07 10:05
hazard999 hat folgendes geschrieben: |
Hallo nochmal,
das einfachste ist sicher wenn du dir MadExcept besorgst. |
Naja, ich denke mal, es ist vielleicht noch einfacher, wenn er die Jedi-Units holt. Die sind kostenlos und die Sources sind mit dabei.
http://sourceforge.net/projects/jvcl
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!