2014-03-26 18 views
3

我想在Linux下跟蹤C程序,並記錄所有函數調用並以樹的格式返回。 例如,源代碼:如何跟蹤所有本地函數調用並退出,並將其記錄到文件中以供查看

void a() 
{ 
    printf("a\n"); 
} 
void b() 
{ 
    printf("b\n"); 
} 

void c() 
{ 
    a(); 
    b(); 
} 

int main() 
{ 
    a(); 
    b(); 
    c(); 
} 

而且我想類似以下的輸出:

call main 
    call a 
    exit a 
    call b 
    exit b 
    call c 
     call a 
     exit a 
     call b 
     exit b 
    exit c 
exit main 

這是一個理想主義的輸出。我只想獲得所有本地函數調用和返回的過程,因此類似的輸出也是受歡迎的。

+1

那麼使用'printf'跟蹤出入境出的功能(的構造函數/析構函數的概念C++)。要打印文件使用'fprintf' –

+2

請檢查此鏈接..它可能會有所幫助。 http://stackoverflow.com/questions/10374005/how-to-trace-function-call-in-c –

+0

這是一個大項目,所以很難注入fprintf中陳述所有功能手動。有什麼工具可以幫助我嗎? – river

回答

2

GCC -finstrument函數做我的工作

0

爲了生產通過修改代碼,這樣的輸出,嘗試這樣的事情(不優化,但做這項工作):在每一個功能來跟蹤的開始

size_t indent; 

#define ENTER_FUNC(function_name)      \ 
    indent++;           \ 
    for(size_t i=0; i<indent; i++) printf("\t");  \ 
    printf("Call %s\n", function_name); 

#define EXIT_FUNC(function_name)      \ 
    for(size_t i=0; i<indent; i++) printf("\t");  \ 
    printf("Exit %s\n", function_name);    \ 
    indent--; 

電話ENTER_FUNCEXIT_FUNC之前的任何return。 您還可以豐富宏以寫入日誌文件。

否則有像gprof一些分析工具,爲example

+0

非常感謝!這是一個很大的項目,因此很難將ENTER_FUNC語句手動注入到所有函數中。有沒有什麼工具可以幫助我將ENTER_FUNC插入所有功能? – river

+0

那麼,如果你知道Python,你可以編寫一個腳本來完成這項工作。它也可以通過適當的搜索和替換命令(小心地)在像Vim這樣的編輯器中完成。例如:無論何處有'return [whatever];'插入'EXIT_FUNC'。 另請注意,如果您有大量的電話,這些宏將深深影響您的表現。而且它們不能抵禦競爭性的呼叫(線程等) – Coconop

相關問題