2012-12-30 29 views
5

我正在使用4-5個.c文件(每個2000到5000行左右),其中包括幾個 頭文件。目前我沒有任何調試打印,它可以幫助我調試程序 在執行過程中。自動打印C中的結構和變量

我的問題是: - 有沒有一種方法(或一些現有的工具)來解析.c文件,並添加新集打印 語句在.c文件當前範圍內的所有的變量?就像 一樣VC++允許我們看到本地人和全局變量等。我需要在每一步打印它們。另外, 指針應該解除引用。

例如,讓我們說在.c文件中的一個點上,有10個全局變量和3個局部變量。 我需要生成智能printfs來打印這13個變量。後面 該程序如果有20個變量,我應該能夠打印20個變量等。 包含的頭文件包含這些變量(可以是結構體/指針/數組或一些變量中的每一個的所有相關聲明組合等等) 我試圖通過perl腳本實現這一點。

我做什麼,我生成的預處理文件(.i文件),我試圖通過perl的 解析,然後生成具體到每個變量單獨的打印功能,但半 天的努力後,我意識到,它的太耗時。 有沒有一種工具可以做到這一點?如果不是這樣,任何接近它的東西都應該是好的 (我可以在其上應用一些perl處理等) 我的目標是在程序執行後,在程序執行期間的每一步,我都應該能夠看到變量(在該範圍內有效)而不必調用調試器。

我被允許處理.c文件並重新編寫它們等等。 希望我的問題很清楚,謝謝您的回覆。

+1

..你也可以得到答案。 BTW聽到段落? –

+0

如何挑選最佳答案? –

+2

單擊它旁邊的複選標記,它應該將顏色從灰色更改爲綠色 – Fingolfin

回答

3

假設您的C程序可以被Frama-C的值分析所解釋,這個分析與給定的分析很不相同,您可以使用它來獲取程序中每個點或點上的所有活動變量值的日誌出於興趣。

考慮下面的程序:

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

該程序運行frama-c -val -slevel 1000000000 -no-results t.c產生的日誌:

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

Frama_C_dump_each()聽取了我手動插入,但你也可以促使這個解釋讓它會在每個語句中自動轉儲一個狀態。

對於這種方法的工作,你需要你的程序的全部源代碼,包括標準庫函數(strlen()memcpy(),......),你必須在main()功能的開始硬編碼的輸入值。否則,它將表現爲靜態分析器,而不是C解釋器。

您也可以使用GUI來觀察程序中變量的值,但如果它不是線性的,則由於函數調用或因循環而多次訪問的語句將顯示可以採用的所有值在執行期間。

+0

謝謝。我會試試這個。 –