2013-04-04 86 views
1

給出了一個C源程序。確定 中的每個已定義函數的來源,呼叫數量和呼叫發生的線路。計算C程序中的函數調用次數

我能想出的最好的東西是grep -c 'function (' code.c 但是,這隻適用於我知道函數名稱,它只會提供調用的數量(考慮到該文件中沒有原型)。不知道還有什麼開始,所以任何建議都會得到滿足。

+2

使用標準shell工具無法可靠地執行此操作。您需要像cscope這樣的C語法分析器(http://cscope.sourceforge.net/)。 – 2013-04-05 15:24:44

回答

4

ctags可以可靠地給你一個函數名列表,例如

$ cat test.c 
#include <stdio.h> 

void foo(void) 
{ 
    printf ("Hello World!\n"); 
} 

int main(int argc, char *argv[]) 
{ 
    foo(); 
    return 0; 
} 

$ ctags -x --c-types=f test.c 
foo    function  3 test.c   void foo(void) 
main    function  8 test.c   int main(int argc, char *argv[]) 

這是否幫助您入門?從http://cscope.sourceforge.net/然後

+0

是的,這正是我正在尋找的! – 2013-04-12 05:56:40

-2

你最好在幾個步驟中做到這一點。

首先,使用grep和awk從文件中獲取所有函數名稱並將其保存在臨時文件中。喜歡的東西:

$ grep ^function code.c | awk '{print $2 }' > /tmp/toto 

接下來,在臨時文件中的每個條目,搜索在code.c文件中的函數的名稱所有的出現次數,並得到每個呼叫的行號。例如:

cat /tmp/toto | while read line; do 
grep -n $line code.c 
echo total: `grep $line code.c | wc -l` times 
done 

希望它有幫助。

+1

問題是我需要爲code.c文件中的每個現有函數執行此操作,並且我不應該知道函數名稱。 – 2013-04-04 23:56:56

+0

這就是第一點,從code.c中提取函數名並將它們保存在臨時文件中。 – ophintor 2013-04-05 08:50:08

+2

@axesdenied - 你永遠不需要使用grep AND awk。上面的第一行可以寫成'awk'/^function/{print $ 2}'code.c>/tmp/toto'。隨後的循環不必要地使用cat(UUOC),並且在包含空格,換行符,反斜線,shell匹配字符(例如?或*)等的文件名的各個點上將失敗,並且由於不正則表達式grep的錨定正在使用。 – 2013-04-05 15:23:24

2

下載的cscope(http://en.wikipedia.org/wiki/Cscope)這樣做(檢查選項/語法):

1)建立數據庫(我會從你的源文件命名爲db.csc):

cscope -b -u -f db.csc *.c *.h .... 

2)在數據庫中搜索所有的函數調用:

cscope -d -f db.csc -L -3 '.*' 

,它會給你的每功能+列表哪個函數調用+ T他發出呼叫的線路號碼。您可能需要閱讀手冊頁並使用這些選項進行播放,因爲我上次做這些事情已有數年了。