Laden...

Programm-Ablauf Parser

Erstellt von 7.e.Q vor 17 Jahren Letzter Beitrag vor 17 Jahren 3.537 Views
7.e.Q Themenstarter:in
925 Beiträge seit 2004
vor 17 Jahren
Programm-Ablauf Parser

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

49.485 Beiträge seit 2005
vor 17 Jahren

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

7.e.Q Themenstarter:in
925 Beiträge seit 2004
vor 17 Jahren

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.

M
1.439 Beiträge seit 2005
vor 17 Jahren

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.

7.e.Q Themenstarter:in
925 Beiträge seit 2004
vor 17 Jahren

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.

M
1.439 Beiträge seit 2005
vor 17 Jahren

Für soetwas sind doch Profiler gedacht. Da gibts sicher welche die du kostenlos verwenden kannst. Und du ersparst die die ganze Arbeit.