如何从中获取函数的名称函数指针 in C?
编辑:真实的情况是:我正在编写一个 Linux 内核模块,并且正在调用内核函数。其中一些函数是指针,我想在内核源代码中检查该函数的代码。但我不知道它指向哪个函数。我认为这是可以做到的,因为当系统失败(内核恐慌)时,它会在屏幕上打印出当前的调用堆栈以及函数名称。但是,我想我错了……是吗?
我很惊讶为什么每个人都说这是不可能的。在 Linux 上可以实现非静态函数。
我知道至少有两种方法可以实现这一目标。
有用于回溯打印的 GNU 函数:backtrace()
and backtrace_symbols()
(See man
)。在你的情况下你不需要backtrace()
因为你已经有了函数指针,你只需将它传递给backtrace_symbols()
.
示例(工作代码):
#include <stdio.h>
#include <execinfo.h>
void foo(void) {
printf("foo\n");
}
int main(int argc, char *argv[]) {
void *funptr = &foo;
backtrace_symbols_fd(&funptr, 1, 1);
return 0;
}
编译用gcc test.c -rdynamic
Output: ./a.out(foo+0x0)[0x8048634]
它为您提供二进制名称、函数名称、从函数开始的指针偏移量和指针值,以便您可以解析它。
另一种方法是使用dladdr()
(另一个扩展),我猜print_backtrace()
uses dladdr()
. dladdr()
回报Dl_info
具有函数名称的结构dli_sname
场地。我在这里不提供代码示例,但很明显 - 请参阅man dladdr
了解详情。
注意!两种方法都要求函数是非静态的!
好吧,还有一种方法 - 使用调试信息libdwarf
但这需要未剥离的二进制文件,而且不太容易做到,所以我不推荐它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)