7

我有以下问题:当我在 C 中使用 backtrace(3) 函数获得回溯时,返回函数名称的符号很容易通过 dwarf 库和 dladdr(3) 确定。

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

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

谢谢!

更新:

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

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

4

2 回答 2

1

根据您引用的典型地址的实质性差异进行猜测,一个来自实际的共享库,另一个来自您的主要可执行文件。在手册页dladdr(3)的各行之间读取,如果符号不在加载的模块中,dlopen(3)则可能无法重建匹配的文件和符号名称。

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

于 2010-08-27T21:54:30.730 回答
0

addr2line(1) 可能正是您正在寻找的东西。

于 2010-08-27T21:10:53.320 回答