2017-04-20 132 views
2

我想寫一個打印LINEFILEFUNC和一些其他的東西調試打印功能。轉折是,我想根據自己的調用堆棧深度自動縮進打印輸出,所以像獲取調用堆棧的深度GCC

main.c:55:main() 
    functions.c:33:function1() 
    functions.c:133:function2() 
     functions.c:33:function1() 
     functions.c:33:function1() 

如果FUNCTION1立即返回,並且調用函數2次功能1。

我想這可以通過使用一個全局變量來完成,每次函數被調用時都會手動遞增,每當返回時遞減,但是這將需要相當多的代碼基礎。我想知道是否有更簡單的方法來做到這一點?

我不介意解決方案是非標準的C,只要它是標準的GNU。

+0

[提示](https://開頭的連接。 wiktionary.org/wiki/BTDT):灌輸一些控制來限制代碼搜索堆棧的高度,因爲堆棧可能非常深。 – chux

回答

3

您可以使用Gcc中的代碼分析選項來執行此操作。 https://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Code-Gen-Options.html

-finstrument函數
產生的入口和出口功能的儀器調用。在功能輸入之後,功能 退出之前,將使用當前功能的 地址及其呼叫站點調用以下分析功能。 (在某些平臺上, __builtin_return_address不會超出當前功能工作,所以調用點信息可能不可用的分析,否則 功能。)

void __cyg_profile_func_enter (void *this_fn, 
           void *call_site); 
void __cyg_profile_func_exit (void *this_fn, 
           void *call_site); 
+0

太棒了!如果我理解正確,GCC只提供原型,並且由用戶以他/她選擇的方式實現它們由用戶決定。 – user7893856