2017-04-20 172 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