在gcc中获取深度调用堆栈

时间:2017-04-20 08:21:28

标签: c gcc

我想编写一个调试打印功能,可以打印 LINE FILE func 以及其他一些内容。扭曲是因为我想根据调用堆栈中的深度自动缩进打印输出,所以像

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

如果function1立即返回,并且function2两次调用function1。

我想这可以通过使用全局变量来完成,该变量在每次调用函数时手动递增,并在返回时递减,但这需要相当多的代码库重新执行。我想知道是否有更简单的方法吗?

我不介意解决方案是否是非标准C,只要它是标准GNU。

1 个答案:

答案 0 :(得分: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);