Dl_info无法获得函数名
时间: 2023-08-09 13:08:34 浏览: 59
如果`Dl_info`无法获取函数名,一般来说有两种可能:
1. 函数没有导出符号,无法通过`Dl_info`获取函数名。
2. `Dl_info`中的`dli_sname`字段为空,可能是因为函数没有调用,或者函数被内联到其他函数中了。
如果是第二种情况,我们可以通过使用`-g`选项编译程序,使得调试信息包含函数名称。然后使用`addr2line`命令将函数地址转换为函数名和行号。
以下是一个示例代码,可以通过`addr2line`命令获取函数名:
```c++
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include <errno.h>
void print_function_name(void* addr) {
Dl_info info;
if (dladdr(addr, &info) && info.dli_sname) {
printf("%s\n", info.dli_sname);
return;
}
char command[256];
snprintf(command, 256, "addr2line -e /path/to/executable %p", addr);
FILE* fp = popen(command, "r");
if (!fp) {
fprintf(stderr, "Failed to execute command: %s\n", strerror(errno));
return;
}
char output[256];
if (fgets(output, 256, fp)) {
printf("%s", output);
}
pclose(fp);
}
int main() {
// Call some functions
print_function_name((void*)&main);
print_function_name((void*)&printf);
print_function_name((void*)&print_function_name);
return 0;
}
```
需要注意的是,`addr2line`命令只能在包含调试信息的可执行文件或共享库中查找函数名,因此需要使用`-g`选项编译程序。此外,该方法可能会影响程序性能,因为需要启动另一个进程来执行命令。