1,理论未动,示例先行
hello_gcc_callstack.c
#include <stdio.h>
void do_backtrace()
{
void *pc0 = __builtin_return_address(0);
void *pc1 = __builtin_return_address(1);
void *pc2 = __builtin_return_address(2);
void *pc3 = __builtin_return_address(3);
printf("Frame 0: PC = %p\n", pc0);
printf("Frame 1: PC = %p\n", pc1);
printf("Frame 2: PC = %p\n", pc2);
printf("Frame 3: PC = %p\n", pc3);
// getchar();
}
void aaa()
{
do_backtrace();
}
void bbb()
{
aaa();
}
void ccc()
{
bbb();
}
int main()
{
printf("%p %p %p %p\n", aaa, bbb, ccc, main);
ccc();
return 0;
}
编译:
gcc hello_gcc_callstack.c
运行:
./a.out
2,作用
_builtin_return_address(0)是GCC编译器提供的一个内建函数,用于获取当前函数调用栈中指定层次的返回地址。这个函数返回调用当前函数的函数的返回地址,即当前函数返回后将要返回的地址。
工作原理
- __builtin_return_address(0)函数接受一个整数参数,表示要获取的返回地址在调用栈中的层次。参数为0表示获取当前函数调用的返回地址。
- 当调用__builtin_return_address(0)时,编译器会生成相应的机器指令来获取当前函数调用的返回地址。
- 这个函数通常用于调试和性能分析,可以帮助开发人员跟踪函数调用的路径和了解程序的执行流程。
图示被调函数的下一条指令的地址: