給出了一個C源程序。確定 中的每個已定義函數的來源,呼叫數量和呼叫發生的線路。計算C程序中的函數調用次數
我能想出的最好的東西是grep -c 'function (' code.c
但是,這隻適用於我知道函數名稱,它只會提供調用的數量(考慮到該文件中沒有原型)。不知道還有什麼開始,所以任何建議都會得到滿足。
給出了一個C源程序。確定 中的每個已定義函數的來源,呼叫數量和呼叫發生的線路。計算C程序中的函數調用次數
我能想出的最好的東西是grep -c 'function (' code.c
但是,這隻適用於我知道函數名稱,它只會提供調用的數量(考慮到該文件中沒有原型)。不知道還有什麼開始,所以任何建議都會得到滿足。
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/然後
是的,這正是我正在尋找的! – 2013-04-12 05:56:40
你最好在幾個步驟中做到這一點。
首先,使用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
希望它有幫助。
問題是我需要爲code.c文件中的每個現有函數執行此操作,並且我不應該知道函數名稱。 – 2013-04-04 23:56:56
這就是第一點,從code.c中提取函數名並將它們保存在臨時文件中。 – ophintor 2013-04-05 08:50:08
@axesdenied - 你永遠不需要使用grep AND awk。上面的第一行可以寫成'awk'/^function/{print $ 2}'code.c>/tmp/toto'。隨後的循環不必要地使用cat(UUOC),並且在包含空格,換行符,反斜線,shell匹配字符(例如?或*)等的文件名的各個點上將失敗,並且由於不正則表達式grep的錨定正在使用。 – 2013-04-05 15:23:24
下載的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他發出呼叫的線路號碼。您可能需要閱讀手冊頁並使用這些選項進行播放,因爲我上次做這些事情已有數年了。
使用標準shell工具無法可靠地執行此操作。您需要像cscope這樣的C語法分析器(http://cscope.sourceforge.net/)。 – 2013-04-05 15:24:44