Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Programm-Ablauf Parser
7.e.Q
myCSharp.de - Member

Avatar #avatar-3402.jpg


Dabei seit:
Beiträge: 938
Herkunft: Scheeßel

Themenstarter:

Programm-Ablauf Parser

beantworten | zitieren | melden

Moin Leute,

ich hatte da gerade so eine Idee. Ich hab ein C++ Programm, das auf der Konsole einer Linux-Maschine läuft. Dieses Programm hat sogenannte WHERAMI Makros drin, welche - an bestimmten Stellen eingefügt - Informationen in der Form "HERE: Datei.cxx:zeile (Funktionsname)" ausgeben. Oder ähnlich... das Format kann man ja selbst bestimmen.

Aus diesen Ausgaben - umgelenkt in eine Log-Datei - müsste sich doch eigentlich zusammen mit den Source-Dateien eine grafische Darstellung des Ablaufes ausgeben lassen. Also man hat die Dateien grafisch dargestellt als Blöcke (auf-/zuklappbar, Funktionen auch auf-/zuklappbar, wie in der UML-Darstellung im Studio) und dazwischen Pfeile, die die Aufrufe darstellen.

100% genau wird das nicht, aber umso genauer, je mehr WHEREAMIs man in den Sourcecode packt.

Ich schreib das hier, weil ich mir vorstellen kann, daß die Erstellung der Oberfläche und der Parser in C# am einfachsten ist.

Was haltet ihr von so einer Idee?

Grüße,
Hendrik
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo 7.e.Q,

wenn die Ausgaben nur sequentiell untereinander stehen, weißt du ja nicht, wer wen aufgerufen hast. Was anderes ist es, wenn man die Aufruftiefe kennt (z.B. wenn die Ausgabe je nach Aufruftiefe entsprechend eingerückt sind). Aber auch dann kommt man zu falschen Annahmen, wenn nicht alle Methoden WHERAMI verwenden, was im schlimmsten Fall kontraproduktiv wird.

Wenn alle Methoden WHERAMI benutzen und die Aufruftiefe immer bekannt ist, ist es dagegen ganz einfach. Man braucht die Ausgabe nur ein TreeView zu füllen. Ob die Information in dieser Form, wegen des möglichen Auf- und Zuklappens allerdings wesentlich mehr nützt, als wenn man die gleiche Information (mit den Einrückungen) in eine Editor durchblättert, halte ich für fraglich.

herbivore
private Nachricht | Beiträge des Benutzers
7.e.Q
myCSharp.de - Member

Avatar #avatar-3402.jpg


Dabei seit:
Beiträge: 938
Herkunft: Scheeßel

Themenstarter:

beantworten | zitieren | melden

Man könnte dann, um das Problem des Aufrufers zu beheben, einen globalen String anlegen, in dem man in jeder Funktion ganz am Anfang als zweite Operation der Funktion nach dem ersten WHEREAMI den Funktionsnamen ablegt. Das muss man natürlich konsequent überall tun.


std::string gCallername;

#define WHEREAMI() fprintf(stderr, "HERE: %s -> %s:%d (%s)\n", gCallername.c_str(), __FILE__, __LINE__, __FUNCTION__)

#define MYNAMEIS() gCallername = __FUNCTION__;

void blah(int x, int y)
{
  WHEREAMI();
  MYNAMEIS();
  .
  .
  .

  return;
}


Das muss man natürlich konsequent zuendeführen.
private Nachricht | Beiträge des Benutzers
marsgk
myCSharp.de - Member



Dabei seit:
Beiträge: 1443
Herkunft: Linz, Austria

beantworten | zitieren | melden

Das ist aber sehr umständlich und fehleranfällig.
Du könntest ja die Debug-Informationen auslesen und so rausfinden wann welche Funktion aufgerufen wurde.
private Nachricht | Beiträge des Benutzers
7.e.Q
myCSharp.de - Member

Avatar #avatar-3402.jpg


Dabei seit:
Beiträge: 938
Herkunft: Scheeßel

Themenstarter:

beantworten | zitieren | melden

Zitat
Original von marsgk
Das ist aber sehr umständlich und fehleranfällig.
Du könntest ja die Debug-Informationen auslesen und so rausfinden wann welche Funktion aufgerufen wurde.

Ah, und das geht genau wie? Das Problem dabei ist ja, daß bestimmte Funktionen nicht in jedem Fall aufgerufen werden. Sonst wär's kein Programm. Beispielsweise Funktionsaufrufe in if-Blöcken. Wann und wie oft diese Aufrufe erfolgen wird in den Debug-Infos sicherlich nicht gespeichert.

Es geht mir im Prinzip darum, eine genaue Ablauf-Protokollierung von meinem Programm zu erhalten (platformunabhängig) und diese dann mithilfe des Source-Codes grafisch darzustellen.
private Nachricht | Beiträge des Benutzers
marsgk
myCSharp.de - Member



Dabei seit:
Beiträge: 1443
Herkunft: Linz, Austria

beantworten | zitieren | melden

Für soetwas sind doch Profiler gedacht. Da gibts sicher welche die du kostenlos verwenden kannst. Und du ersparst die die ganze Arbeit.
private Nachricht | Beiträge des Benutzers