2012-12-30 20 views
5

Pracuję z plikami 4-5 .c (od 2000 do 5000 linii każdy), które zawierają kilka nagłówków . Obecnie nie mam żadnych wydruków debugowania, które pomogłyby mi w debugowaniu programu w trakcie realizacji.Automatyczne drukowanie struktur i zmiennych w C

Moje pytanie brzmi: - Czy istnieje sposób (lub jakieś istniejące narzędzie) do analizy plików .c i dodania nowego zestawu instrukcji drukowania dla wszystkich zmiennych w bieżącym zakresie w pliku .c? Tak samo, jak w przypadku VC++ pozwala nam zobaczyć Lokale i globale itp. Potrzebuję ich wydrukować na każdym kroku. Ponadto, należy usunąć dereferencje wskaźników .

Na przykład. powiedzmy w jednym miejscu pliku .c, jest 10 zmiennych globalnych i 3 locals. Potrzebuję wygenerować inteligentne printfs, aby wydrukować te 13 zmiennych w tym punkcie. Później w program, jeśli jest 20 zmiennych, powinienem móc wydrukować 20 zmiennych itp. Dołączone pliki nagłówkowe zawierają wszystkie odpowiednie deklaracje dla każdej z tych zmiennych
(które mogą być strukturami/wskaźnikami/tablicami lub niektórymi kombinacje etcetera itp.) Próbowałem osiągnąć to poprzez skrypt Perla.

Co zrobiłem w tym, że wygenerowany plik (przed obróbką .i plik) i starałem parsowania go za pomocą Perl a następnie wygenerować indywidualne funkcje drukowania specyficzne dla każdej zmiennej, ale po wysiłku pół dniach zdałem sobie sprawę, że jego po prostu zbyt czasochłonne. Czy istnieje narzędzie, które już to robi? Jeśli nie to, wszystko blisko powinno być dobre wystarczy (na które mogę zastosować trochę przetwarzania perl itp.) Moim celem jest, aby po wykonaniu programu, na każdym kroku podczas wykonywania programu, powinienem być w stanie zobaczyć zmienne (ważne w tym zakresie) bez konieczności wywoływania debuggera.

Mam pozwolenie na przetwarzanie plików .c i ponowne ich zapisywanie itp. Itp. Mam nadzieję, że moje pytanie jest jasne i dziękuję za twoje odpowiedzi.

+1

.. również możesz uzyskać odpowiedź. BTW Słyszałeś paragrafy? –

+0

jak wybrać najlepszą odpowiedź? –

+2

Kliknij na znacznik wyboru obok niego, powinien on zmienić kolor z szarego na zielony – Fingolfin

Odpowiedz

3

Zakładając, że twój program C może być interpretowany przez analizę wartości Frama-C, która jest daleka od danej, możesz użyć jej do uzyskania logu wartości wszystkich zmiennych żywych w każdym punkcie programu lub w punktach zainteresowań.

Rozważmy następujący program:

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; 
} 

Running frama-c -val -slevel 1000000000 -no-results t.c na ten program generuje log:

[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== 

W Frama_C_dump_each() oświadczenia zostały wstawione przeze mnie ręcznie, ale można też sugerować tłumacza, tak aby zrzuca stan automatycznie przy każdym wyciągu.

Na takie podejście do pracy, trzeba cały kod źródłowy programu, w tym standardowych funkcji bibliotecznych (strlen(), memcpy(), ...) i musisz ciężko kod wartości wejścia na początku funkcji main(). W przeciwnym razie będzie zachowywał się jak analizator statyczny, tak naprawdę, zamiast zachowywać się jak interpreter języka C.

Można również użyć parametru GUI do obserwowania wartości zmiennych w programie, ale jeśli nie jest on liniowy, instrukcje, które są odwiedzane kilka razy z powodu wywołań funkcji lub z powodu pętli, pokażą wszystkie wartości, które można zastosować podczas wykonywania.

+0

Dzięki. Spróbuję tego. –