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)时,编译器会生成相应的机器指令来获取当前函数调用的返回地址。
- 这个函数通常用于调试和性能分析,可以帮助开发人员跟踪函数调用的路径和了解程序的执行流程。
图示被调函数的下一条指令的地址: