2012-12-30 4 views
5

Ich arbeite mit 4-5 .c Dateien (ca. 2000 bis 5000 Zeilen), die mehrere Header enthalten. Derzeit habe ich keine Debug-Ausdrucke, die mir helfen würden, das Programm zu debuggen während seiner Ausführung.Automatisches Drucken der Strukturen und Variablen in C

Meine Frage ist: - Gibt es eine Möglichkeit (oder ein vorhandenes Werkzeug), um die .c-Dateien und fügen Sie neuen Satz von Druck Aussagen für alle Variablen im aktuellen Bereich in der C-Datei zu analysieren? Genauso wie VC++ ermöglicht es uns, Locals und Globals usw. zu sehen. Ich brauche sie bei jedem Schritt gedruckt. Außerdem sollten Zeiger dereferenziert werden.

Für z. Nehmen wir einmal an einer Stelle in der .c-Datei, gibt es 10 globale Variablen und 3 Einheimische. Ich muss die intelligenten printfs erzeugen, um diese 13 Variablen an diesem Punkt zu drucken. Später in das Programm, wenn es 20 Variablen gibt, sollte ich in der Lage sein, die 20 Variablen usw. Die enthaltenen Header-Dateien enthalten alle relevanten Deklarationen für jede dieser
Variablen (die Strukturen/Zeiger/Arrays oder einige sein können Kombinationen etc etc.) Ich habe versucht, dies per Perl-Skript zu erreichen.

Was ich getan habe ist, erzielte ich die vorverarbeiteten Datei (.i-Datei) und ich versuchte es über Perl Parsen und dann einzelne Druckfunktionen für jede Variable spezifische erzeugen, aber nach einem halben Tagen Aufwand realisierte ich, dass seine einfach zu zeitaufwendig. Gibt es ein Tool, das das schon macht? Wenn nicht, sollte alles in der Nähe gut sein genug (Auf dem ich einige Perl-Verarbeitung usw. anwenden kann) Mein Ziel ist, dass nach der Programmausführung, bei jedem Schritt während der Programmausführung, ich in der Lage sein sollte, die Variablen zu sehen (Gültig in diesem Bereich), ohne den Debugger aufzurufen.

Ich bin berechtigt, die .c-Dateien zu verarbeiten und sie erneut zu schreiben etc. etc. Hoffe meine Frage ist klar und danke für Ihre Antworten.

+1

.. auch Sie können eine Antwort bekommen. BTW Gehörte Absätze? –

+0

wie man beste Antwort wählt ?? –

+2

Klicken Sie auf das Häkchen daneben, es sollte die Farbe von grau zu grün wechseln – Fingolfin

Antwort

3

Angenommen, Ihr C-Programm kann durch die Wertanalyse von Frama-C interpretiert werden, die weit von einer gegebenen liegt, können Sie damit ein Protokoll der Werte aller lebenden Variablen an jedem Punkt des Programms oder an Punkten erhalten von Interesse.

Betrachten Sie das folgende Programm:

int x = 1; 

main(){ 
    int l; 

    x=2; 
    Frama_C_dump_each(); 
    l=3; 
    Frama_C_dump_each(); 
    { 
    int blocklocal = l + 1; 
    Frama_C_dump_each(); 
    x = blocklocal + 1; 
    Frama_C_dump_each(); 
    } 
    Frama_C_dump_each(); 
    return 0; 
} 

Lauf frama-c -val -slevel 1000000000 -no-results t.c zu diesem Programm erzeugt das Protokoll:

[value] Values of globals at initialization 
     x ∈ {1} 
[value] DUMPING STATE of file t.c line 7 
     x ∈ {2} 
     =END OF DUMP== 
[value] DUMPING STATE of file t.c line 9 
     x ∈ {2} 
     l ∈ {3} 
     =END OF DUMP== 
[value] DUMPING STATE of file t.c line 12 
     x ∈ {2} 
     l ∈ {3} 
     blocklocal ∈ {4} 
     =END OF DUMP== 
[value] DUMPING STATE of file t.c line 14 
     x ∈ {5} 
     l ∈ {3} 
     blocklocal ∈ {4} 
     =END OF DUMP== 
[value] DUMPING STATE of file t.c line 16 
     x ∈ {5} 
     l ∈ {3} 
     =END OF DUMP== 

Die Frama_C_dump_each() Aussagen manuell von mir eingefügt wurden, aber man könnte auch den Dolmetscher Schub, so dass Bei jeder Anweisung wird automatisch ein Status ausgegeben.

für diesen Ansatz zu arbeiten, müssen Sie den gesamten Quellcode des Programms, einschließlich der Standard-Library-Funktionen (strlen(), memcpy(), ...) und Sie müssen die Werte des Eingangs hart Code am Anfang der main() Funktion. Andernfalls verhält es sich wie das statische Analyseprogramm, das es tatsächlich ist, anstatt sich als C-Interpreter zu verhalten. Sie können auch die GUI verwenden, um Werte von Variablen in Ihrem Programm zu beobachten, aber wenn es nicht linear ist, zeigen Anweisungen, die mehrmals wegen Funktionsaufrufen oder wegen Schleifen aufgerufen werden, alle Werte an, die übernommen werden können während der Ausführung.

+0

Danke. Ich werde es versuchen. –