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!

user profile iconjjturbo 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); // Zeigt Datei/Zeilennummer an
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

user profile iconhazard999 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