AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Funktionsname herausfinden

Ein Thema von hitzi · begonnen am 9. Mär 2009 · letzter Beitrag vom 11. Mär 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#1

Funktionsname herausfinden

  Alt 9. Mär 2009, 19:46
Hallo,

ist es irgendwie möglich den Funktionsnamen herauszufinden? So in der Art:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Caption := Self.ClassName + ' ' + Self.???; //was muss statt den ??? hin damit in der Caption "TForm1 FormCreate" steht?
end;

Viele Grüße
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#2

Re: Funktionsname herausfinden

  Alt 9. Mär 2009, 19:48
Nein, da alle Namen beim Compilieren entfernt werden.

Bevor hier einer Meckert:
Published Eigenschaften werden nicht entfernt.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Funktionsname herausfinden

  Alt 9. Mär 2009, 19:51
Schade. Danke für die Info
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Funktionsname herausfinden

  Alt 9. Mär 2009, 19:53
Doch. Ist möglich. Jedoch sind dazu TD32-Debuginfos und die Hilfe der JCL-Debug-Units nötig. Dann kannst du C-Like den Funktionsnamen/Stack/Zeilennumer etc. bekommen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#5

Re: Funktionsname herausfinden

  Alt 9. Mär 2009, 20:04
Na gut - aber dafür wird eine Map-Datei benötigt (bei der JCL).
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Funktionsname herausfinden

  Alt 9. Mär 2009, 20:07
Zitat von generic:
Na gut - aber dafür wird eine Map-Datei benötigt (bei der JCL).
Nichts bekommt man geschenkt. In einer managed Umgebebung bekommt man das zwar geschenkt auch ohne Extra Debug-Infos, aber dafür liegt der Quellcode offen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Funktionsname herausfinden

  Alt 9. Mär 2009, 21:07
Auch dir vielen Dank Bernhard. Werd mir das Handling mal mit dieser Map Datei und JCL ansehen.
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat
DMW

Registriert seit: 6. Sep 2006
Ort: Münster
269 Beiträge
 
Delphi XE Professional
 
#8

Re: Funktionsname herausfinden

  Alt 9. Mär 2009, 23:18
In C++Builder gibt es das __FUNC__-Makro, das den Namen der aktuellen Funktion als Stringkonstante enthält; vielleicht gibt es etwas Vergleichbares auch für Delphi?


Zitat von generic:
Published Eigenschaften werden nicht entfernt.
Und da Event-Handler published sind, ist durchaus RTTI für FormCreate verfügbar
Allerdings ist es praktisch unmöglich, eine beliebige Codeposition zweifelsfrei mit der Adresse der zugehörigen Funktion zu assoziieren, ohne über eine vollständige Funktionsliste zu verfügen, daher hilft das nichts.
Moritz
"Hey, it compiles! Ship it!"
C++Builder Pages
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#9

Re: Funktionsname herausfinden

  Alt 10. Mär 2009, 00:43
Zitat von generic:
Allerdings ist es praktisch unmöglich, eine beliebige Codeposition zweifelsfrei mit der Adresse der zugehörigen Funktion zu assoziieren, ohne über eine vollständige Funktionsliste zu verfügen, daher hilft das nichts.
Das ist nicht ganz richtig, es funktioniert in manchen Fällen allerdings nicht allen.
Tatsächlich war das die erste Frage, die mir durch den Kopf ging, als ich das hier gelesen hab und ich musste es gleich mal ausprobieren.
Es hängt davon ab wie der Compiler den Code erstellt, der deine Funktion aufruft, wenn es ein call mit einem offset aus einem Register ist, ist es fast unmöglich, da nicht mehr klar ist, welchen Wert das Register hatte und der Wert auch nicht ohne einen Großteil des Codes davor erneut durchzugehen wiederhergestellt werden kann. Wenn es sich allerdings um einen call mit festem Offset handelt ($E8 + 4 byte signed integer in little endian), dann ist es ohne weiteres möglich den Einsprungspunkt der Funktion zurückzurechnen.
Ein Label in asm Code am Anfang der Funktion ist übrigens, falls jemand auf die Idee kommen sollte, auch wenig hilfreich, da (ausgenommen seien reine asm Routinen) der Compiler davor dazu neigt, eine unterschiedliche Länge von Befehle zur Erstellung eines stackframes einzufügen. Abgesehen davon ist das auch noch aufwendiger als ein @Funktionsname (wofür man den Namen angeben müsste und dann bei jeder Funktion anderen Code hat) und erfüllt ja nicht die Bedingung, dass das ganze für jede Funktion mit dem selben (möglichst einzeiligen) Befehl geht.

Aber imho ist es am sinnvollsten in solchen Protokoll-/Fehlermeldungen (oder für was braucht man das sonst?) einfach den Wert des EIP Registers einzufügen. Ist natürlich bei DLLs sinnlos und auch bei "normalen" PE nen gewisses Risiko, das nicht an die Standardadresse geladen wird, aber in 95% der Fälle sollte das eine hilfreiche Information (sogar genau wo's geknallt hat) sein.

Was das Zurückrechnen der Einsprungspunkte betrifft, scheint das nicht zu funktionieren, falls die aufrufende Funktion ein Event ist, das aus der Messageschleife ausgelöst wird, aber ich habs jetzt nicht mehr genau durchprobiert.
Man kann einen Barbier definieren als einen, der alle diejenigen rasiert, und nur diejenigen, die sich nicht selbst rasieren.
Rasiert sich der Barbier?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: Funktionsname herausfinden

  Alt 10. Mär 2009, 07:18
Zitat von DMW:
In C++Builder gibt es das __FUNC__-Makro, das den Namen der aktuellen Funktion als Stringkonstante enthält; vielleicht gibt es etwas Vergleichbares auch für Delphi?
Ja. Wie schon geschrieben: JCL Debug-Units.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz