如何获取C函数指针的函数名称

我有以下问题:当我使用backtrace(3)函数在C中获得回溯时,返回的符号可以使用dwarf库和dladdr(3)轻松确定函数的名称.

问题是如果我有一个简单的函数指针(例如通过传递它和函数),那么dladdr矮函数就无济于事.似乎指针与backtrace(3)返回的指针不同(这并不奇怪,因为回溯直接从堆栈中获取这些函数指针).

我的问题是,是否有一些解决这些名称的方法?另外,我想确切地知道两个指针之间的区别.

谢谢!

更新:

指针之间的差异非常显着:
我得到的回溯是:0x8048ca4
直接指针版本:0x3ba838

在我看来,第二个需要一个偏移量.

最佳答案
根据您引用的典型地址的实质差异进行猜测,一个来自实际的共享库,另一个来自您的主要可执行文件.在man page for dladdr(3)的行之间读取,可能是这样的情况:如果符号不在由dlopen(3)加载的模块中,那么它可能无法重建匹配的文件和符号名称.

我假设您没有从这里关注的任何模块中删除符号,或者所有投注都已关闭.如果可执行文件包含符号,则应该可以在其中查找与任何可命名函数的地址完全匹配的符号.毕竟,指向函数的指针就是这样.

转载注明原文:如何获取C函数指针的函数名称 - 代码日志