Trace-Aufgabe (Konstruktion eines Funktionsgraphen)

 

Angenommen, wir haben einen Code (Funktionen, Klassen usw.)

Die Aufgabe besteht darin, einen Aufrufstapel zu erstellen. Aber nicht nur linear, sondern als Baum .

Der Baumknoten ist ein Funktionseintrag, und die Verzweigungen sind Aufrufe zu den folgenden Funktionen des aktuellen Funktionsknotens.

Zum Beispiel gibt es eine solche Struktur von Funktionen:

void Main() {  A(); B(); }

void A() { /*вошли в А*/ a(); b(); c(); }
void B() { /*Вошли в B*/ a(); b(); c(); }

void a() { /*Вошли в а */ }
void b() { /*Вошли в b */ }
void c() { /*Вошли в c */ }

Das Ergebnis sieht wie folgt aus


Obligatorische Bedingung:

Sie können eine einzige Funktion zu bestehenden Codefunktionen hinzufügen, um die Verfolgung zu organisieren - direkt nach "{".
Ändern Sie weder die Eingabeparameter der Quellfunktionen noch deren Ergebnisse oder den darin enthaltenen Code in irgendeiner Weise.

Diese Bedingung ist notwendig, um keine großen Code-Änderungen vorzunehmen, sondern nur ein und dieselbe Ablaufverfolgungsfunktion (nennen wir sie zum Beispiel _TRACE_IN_) in alle bestehenden Code-Funktionen einzufügen. Um alle Pässe des Quellcodes zu erhalten und den Aufrufbaum zu erstellen.


Ich würde mich freuen, wenn Sie mir Ihre Ideen oder Varianten mitteilen würden.
Egal wie ich es drehe und wende, ich stoße auf einen Teufelskreis: Ich sollte nicht eine, sondern zwei Funktionen aufrufen, um einen solchen Baum zu bilden. Aber vielleicht brauche ich nur einen. :)

 

Sie möchten also ein Programm erstellen, das den Algorithmus der Quelle erkennt.

Ich habe etwas Ähnliches für mich gemacht, als ich die Programme anderer Leute in Asm gebrochen habe, aber ich verstehe Ihren Ansatz nicht...

warum in Form eines Baumes?

Oder vielleicht verstehe ich es nicht.

 
FLET:

D.h. Sie wollen ein Programm zur Erkennung des Algorithmus der Quelle erstellen.
Ich habe etwas Ähnliches für mich gemacht, als ich die Programme anderer Leute in Asm gebrochen habe, aber ich verstehe Ihren Ansatz nicht...
Warum als Baum?
oder so etwas, das ich nicht verstehe.


Ich habe nicht an "brechen" gedacht. Aber Sie haben es richtig gemacht. Dies ist für den Aufbau einer logischen Codestruktur.

Das heißt, meine Aufgabe - wenn ich einen Arbeitscode einschalte (meinen eigenen oder den eines anderen oder z.B. aus der Standardauslieferung von MT5) - bekomme ich in einem separaten Fenster den gesamten Stapel der aufgerufenen Funktionen als Baum. Das heißt, an der Wurzel - Funktion start() und von dort geht es nach oben und über....

Ich habe den Baum schon vor langer Zeit eingeführt. Es bietet eine Analyse der in Funktionen verbrachten Zeit (zur Analyse der Codequalität), der Anzahl der Funktionsaufrufe, der Verfolgung von Variablenwerten usw. Ich habe auch drei Optionen für die Anzeige dieses Baums implementiert - wie auf dem Screenshot zu sehen, sowie als Kreis- und Liniendiagramm. Aber ich habe das alles für kleine Dinge getan.

Die Hauptaufgabe, die sich mir stellte, war das Ausfüllen der Baumstruktur selbst.

Ich brauche eine Idee, wie man mit einer Funktion (oder vielleicht mehreren Zuweisungen, aber die Hauptsache ist, dass sie in einer Reihe sind), die der Quellcode-Funktion hinzugefügt wird, eine solche Struktur wie auf dem Screenshot zu bauen.

 
sergeev:

Ich brauche eine Idee, wie ich eine Struktur wie die auf dem Bildschirmmit nur einer Funktion, die am Anfang der Code-Funktionen hinzugefügt wird, aufbauen kann.

Reicht der Nachweis der Unmöglichkeit einer Idee ?
 
MetaDriver:
Der Nachweis der Unmöglichkeit einer Idee reicht aus?

willen.... Aber erst nach 3 Seiten Diskussion der Möglichkeiten :))

Komplexe Implementierungen, zusätzliche Variablen, Verwendung von Global, oder was auch immer. akzeptiert alles :)

 
sergeev:

willen.... aber erst nach 3 Seiten Diskussion der Optionen :))
Lan. Ich warte auf Seite vier ;-)
 
sergeev:

das ist es wert.... aber erst nach 3 Seiten Diskussion über Varianten :))


Die Aufgabe bestand also darin, das Thema mit 3 Seiten Text zu füllen? :), ok, los geht's ;)

1. Arbeit mit Strings: Funktion eingeben, Funktionsnamen hinzufügen, Funktionsende löschen, log/trace gibt permanent den kompletten String als lineare Liste aus:

start(enter)-func1(enter)-func2(enter)

start(enter)-func1(enter)-func2(exit)

...

dieser Ansatz ist meines Erachtens Zeitverschwendung

2. manuell die Anzahl der Funktionen im Code zählen und diese Zahl wird ein Nummerierungssystem sein, d.h. in einem Code mit 10 Funktionen = Basis 10, in einem Code mit 3 Funktionen = Basis 3, unter Verwendung von Boolescher Algebra oder vielleicht einfacher unter Verwendung von Matrizen, Ausschlussoperationen durchführen oder in die Eingabe/Ausgabe einer Funktion einbeziehen

Ungefähr so, aber ist es die Mühe wert? Es ist eine Menge Arbeit, die getan werden muss.

 

IgorM:

Die Aufgabe wurde also darauf reduziert, das Thema mit 3 Seiten Text zu füllen? :), OK, los geht's ;)

hey, nicht so heiß!!! wir zählen hier jede Seite :)

1. Arbeiten mit Strings: eine Funktion eingeben, einen Funktionsnamen hinzufügen, die Funktion verlassen, löschen,

es passt nicht zu der Bedingung. Sie brauchen nur einen Anruf - bei der Einreise. Am Ausgang ist das unrealistisch. In einer Funktion kann es mehrere Exit-Points geben. Es gibt aber nur einen Eingang. Die "Hinzufügung" muss also nur am Eingang erfolgen.
 
sergeev:

hey hey, nicht so heiß!!! wir haben hier jede Seite gezählt :)

zu spät, dein Wunsch wurde von dir geäußert ;)

zu dem Punkt - sie müssen immer noch mit Matrizen/mehrdimensionalen Feldern arbeiten - dann wird es ein mathematisches Modell Ihrer Spur geben, und wie Sie Eingabe/Ausgabe-Ereignisse von der Funktion behandeln werden, ist eine andere Frage

 
IgorM:

spät, dein Wunsch wurde von dir geäußert ;)

Einen Ast kann man immer vergraben. Und das ist kein Wunsch.

für den Punkt - ich denke, Sie müssen noch mit Matrizen/mehrdimensionalen Arrays arbeiten - dann gibt es ein mathematisches Modell Ihrer Spur, und wie Sie Input/Output-Ereignisse von der Funktion behandeln werden, ist eine andere Frage

Ich verstehe kein Wort. Können Sie mit den Fingern erklären, wie Matrizen hier hineinpassen?

Die Idee ist, die Funktionen in einen Graphen (in der Fachsprache: einen Baum) zu packen. Aber in einer klaren chronologischen Reihenfolge der Anrufe und der Identifizierung dessen, was angerufen wurde. Ein und dieselbe Funktion kann sowohl von start als auch von init aufgerufen werden. Das ist es, was wir in Ordnung bringen müssen.

(Ich entwickle es für/auf MQL5, daher verwende ich Klassen für Graphen)

 
sergeev:

Graph (im Volksmund: Baum).

Ein Baum ist ein Spezialfall eines Graphen.