通过__builtin_return_address获取返回地址后,根据返回地址获取上一级函数的起始地址
时间: 2024-04-16 14:24:27 浏览: 18
您可以使用`__builtin_return_address()`函数来获取返回地址,然后使用调试符号表(如DWARF)来解析返回地址对应的函数信息,进而获取上一级函数的起始地址。
以下是一个示例代码,演示了如何使用`__builtin_return_address()`和`dladdr()`函数来获取上一级函数的起始地址:
```c
#include <stdio.h>
#include <dlfcn.h>
void foo() {
void* return_addr = __builtin_return_address(0);
Dl_info info;
if (dladdr(return_addr, &info)) {
printf("Current function: %s\n", info.dli_sname);
// 获取上一级函数的起始地址
Dl_info prev_info;
if (dladdr((void*)info.dli_saddr - 1, &prev_info)) {
printf("Previous function: %s\n", prev_info.dli_sname);
printf("Previous function start address: %p\n", prev_info.dli_saddr);
}
}
}
int main() {
foo();
return 0;
}
```
请注意,`__builtin_return_address()`函数的参数表示要获取的返回地址的级别,0表示当前函数的返回地址,1表示上一级函数的返回地址,依此类推。
代码中使用了`dladdr()`函数来通过返回地址解析函数信息。它会填充`Dl_info`结构体,其中包含了函数的名称(`dli_sname`)和起始地址(`dli_saddr`)等信息。
请确保您的程序在编译时开启了调试信息(例如使用`-g`选项),以便能够正确解析调试符号表。另外,此示例代码在Linux下编译运行。在其他操作系统或平台上,可能需要进行适当的修改。