2012-02-23 51 views
8

我在嵌入式系統上有一個很老的C代碼的大代碼庫,很遺憾沒有自動化的測試用例/套件。這使得重構和重構代碼成爲一項危險的任務。C函數調用和參數跟蹤 - 測試用例和模擬生成

手動編寫測試用例非常耗時,所以我認爲應該可以通過跟蹤所有函數調用和記錄輸入和輸出值來自動執行此過程的至少一部分。然後,我可以在測試用例中使用這些值(除了某些函數,這不適用於所有測試)。根據收集的數據也可能創建模擬函數。

擁有這樣的測試用例會使重構成爲一個不太危險的活動。

有沒有解決方案已經可以做到這一點?如果我必須自己編寫代碼,那麼最簡單的方法是什麼?

我想過使用ctags來查找函數定義,並將它們包裝在一個記錄參數值的函數中。另一種可能性可能是gcc編譯器插件。

+0

你不覺得這個問題屬於superuser.com ...? – 2012-02-23 15:12:17

+2

@ Mr.32:這是一個與編程高度相關的問題,所以它絕對屬於這裏。 – 2012-02-23 15:39:50

回答

1

有一個gcc選項「-finstrument-functions」,您可以使用該機制爲每個funtion的入口/出口定義自己的回調。

谷歌它,你可以找到很多很好的例子。

[編輯]有了這個gcc選項的回調函數,你只能跟蹤函數的入口/出口,而不是參數。但用一些技巧你也可以追蹤這些參數。 (遍歷當前幀指針以獲取棧上的參數)。

這是一篇文章談的執行理念:

http://linuxgazette.net/151/melinte.html

此外,取決於您的嵌入式系統,在Linux上,你可以嘗試這樣ltrace展現PARAMS(如strace的方式)。在linux上的用戶空間或kernelspace上,函數跟蹤有很多工具可用,ftrace/ust/ltrace/utrace/strace/systemtap /。無論如何,如果你不添加任何硬性調試代碼,就不可能以正確的方式顯示參數。如果您接受添加入口/出口調試信息的努力,那麼它更容易。

另外這裏是一個類似的線程討論這個問題。

Tool to trace local function calls in Linux

+0

這是非常有趣的,但不幸的是,我不明白我將如何能夠訪問和存儲原始函數參數和返回值。這個編譯器擴展甚至可能嗎? – trenki 2012-02-23 19:42:37

+0

謝謝。我必須看看我是否可以將它用於MIPS處理器。 – trenki 2012-02-27 07:06:17