用__builtin_return_address和mach-o获取函数名
时间: 2024-03-18 19:42:14 浏览: 97
在C语言中以编程的方式获取函数名
可以使用以下代码获取函数名:
```c++
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include <mach-o/dyld.h>
#include <execinfo.h>
void print_backtrace() {
void* callstack[128];
int frames = backtrace(callstack, 128);
char** strs = backtrace_symbols(callstack, frames);
for (int i = 0; i < frames; ++i) {
printf("%s\n", strs[i]);
}
free(strs);
}
void print_function_name() {
void* callstack[128];
int frames = backtrace(callstack, 128);
char** strs = backtrace_symbols(callstack, frames);
Dl_info info;
for (int i = 0; i < frames; ++i) {
if (dladdr(callstack[i], &info) && info.dli_sname) {
printf("%s\n", info.dli_sname);
}
}
free(strs);
}
int main() {
print_backtrace();
printf("Function names:\n");
print_function_name();
return 0;
}
```
这段代码通过调用`backtrace`函数获取函数调用栈,然后通过`dladdr`函数将函数指针转换成符号名。需要注意的是,`dladdr`函数只能在当前可执行文件或共享库中查找符号名,因此无法获取系统库的函数名。
阅读全文