有些时候我们很难知道问题出在哪里,特别是类的析构,以及一些函数(调用这个函数的地方很多并且很频繁,不确定调用这个函数的堆栈)的调用,当我们去查找相应功能的代码问题时,如果简单的通过断点不好查找,就可以使用这个办法。
所以我们使用gcc的编译特性使用__builtin_return_address(level)打印出一个函数的堆栈地址。其中level代表是堆栈中第几层调用地址,__builtin_return_address(0)表示第一层调用地址,即当前函数,__builtin_return_address(1)表示第二层。如代码
#define __built_in_return_address(x) t(x)
void f()
{
print("%p,%p" , t(0), t(1));
}
void g()
{
f();
}
分别打印出函数f()和g() 的函数地址,我们通过objdump 出来的文件去查找打印出来的函数地址,这样就能看到调用的函数名了。

本文介绍如何利用GCC内置函数__builtin_return_address(level)来打印函数调用堆栈,帮助开发者定位难以追踪的问题,尤其是在类的析构及频繁调用的函数中。通过该方法可以更有效地进行代码调试。
2002

被折叠的 条评论
为什么被折叠?



