- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试使用 dladdr。它正确定位了库,但未找到函数名称。我可以调用 objdump,做一些数学运算,然后获取我传递给 dladdr 的函数的地址。如果 objdump 可以看到它,为什么 dladdr 不能?
这是我的功能:
const char *FuncName(const void *pFunc)
{
Dl_info DlInfo;
int nRet;
// Lookup the name of the function given the function pointer
if ((nRet = dladdr(pFunc, &DlInfo)) != 0)
return DlInfo.dli_sname;
return NULL;
}
这是一个 gdb 记录,显示了我得到的结果。
Program received signal SIGINT, Interrupt.
[Switching to Thread 0xf7f4c6c0 (LWP 28365)]
0xffffe410 in __kernel_vsyscall ()
(gdb) p MatchRec8Cmp
$2 = {void (TCmp *, TWork *, TThread *)} 0xf1b62e73 <MatchRec8Cmp>
(gdb) call FuncName(MatchRec8Cmp)
$3 = 0x0
(gdb) call FuncName(0xf1b62e73)
$4 = 0x0
(gdb) b FuncName
Breakpoint 1 at 0xf44bdddb: file threads.c, line 3420.
(gdb) call FuncName(MatchRec8Cmp)
Breakpoint 1, FuncName (pFunc=0xf1b62e73) at threads.c:3420
3420 {
The program being debugged stopped while in a function called from GDB.
When the function (FuncName) is done executing, GDB will silently
stop (instead of continuing to evaluate the expression containing
the function call).
(gdb) s
3426 if ((nRet = dladdr(pFunc, &DlInfo)) != 0)
(gdb)
3427 return DlInfo.dli_sname;
(gdb) p DlInfo
$5 = {dli_fname = 0x8302e08 "/xxx/libdata.so", dli_fbase = 0xf1a43000, dli_sname = 0x0, dli_saddr = 0x0}
(gdb) p nRet
$6 = 1
(gdb) p MatchRec8Cmp - 0xf1a43000
$7 = (void (*)(TCmp *, TWork *, TThread *)) 0x11fe73
(gdb) q
The program is running. Exit anyway? (y or n) y
这是我从 objdmp 得到的
$ objdump --syms /xxx/libdata.so | grep MatchRec8Cmp
0011fe73 l F .text 00000a98 MatchRec8Cmp
果然,0011fe73 = MatchRec8Cmp - 0xf1a43000。任何人都知道为什么 dladdr 不能返回 dli_sname = "MatchRec8Cmp"???
我正在运行 Red Hat Enterprise Linux Server 5.4 版 (Tikanga)。我以前看过这个作品。也许这是我的编译开关:
CFLAGS = -m32 -march=i686 -msse3 -ggdb3 -pipe -fno-common -fomit-frame-pointer \
-Ispio -fms-extensions -Wmissing-declarations -Wstrict-prototypes -Wunused -Wall \
-Wno-multichar -Wdisabled-optimization -Wmissing-prototypes -Wnested-externs \
-Wpointer-arith -Wextra -Wno-sign-compare -Wno-sequence-point \
-I../../../include -I/usr/local/include -fPIC \
-D$(Uname) -D_REENTRANT -D_GNU_SOURCE
虽然我认为调试符号与 elf 没有任何关系,但我已尝试使用 -g 而不是 -ggdb3。
最佳答案
If objdump can see it, why can't dladdr
dladdr
只能看到动态符号表中exported 的函数。很有可能
nm -D /xxx/libdata.so | grep MatchRec8Cmp
什么都不显示。事实上,您的 objdump 显示该符号是本地,这证明这是原因。
符号是局部的,因为它具有隐藏的可见性,是静态的,或者因为您以其他方式(例如使用链接描述文件)隐藏了它。
更新:
Those marked with the 'U' work with dladdr. They get "exported" automatically somehow.
它们之所以有效,是因为它们是从一些其他共享库 导出的。 U
代表未解决,即在别处定义。
关于c - dladdr 不返回函数名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11731229/
dladdr()的内存语义是什么? ? #define _GNU_SOURCE #include int dladdr(void *addr, Dl_info *info); typedef str
我已经使用 gcc 的 -finstrument-functions 选项和以下(简化的)代码实现了跟踪行为: void __cyg_profile_func_enter(void *this_fn,
在研究一些库时我发现了这种代码 Dl_info info = { NULL, NULL, NULL, NULL }; if (!dladdr((void*) dirSep, &
我正在为我的应用程序编写分析工具,并且我正在使用 dladdr 将函数指针转换为名称。只要我处于调试状态,一切都可以正常工作,但是一旦我在发行版中编译(使用 XCode 5.1),所有名称转换都会失败
我正在尝试使用 dladdr。它正确定位了库,但未找到函数名称。我可以调用 objdump,做一些数学运算,然后获取我传递给 dladdr 的函数的地址。如果 objdump 可以看到它,为什么 dl
我有一个程序(应用程序,不是共享库): void func() { int RESULT = UNW_ESUCCESS; unw_context_t context; unw_
我使用 dladdr 来获取库的完整路径: Dl_info dl_info; int ret = dladdr((void*)&func, &dl_info); if (ret)
我正在编写一个 C++ 异常类,它必须在抛出站点提供有限的回溯。由于我的应用程序将是多线程的,因此可能会同时抛出异常。我在 Internet 上搜索了这个线程安全问题,但没有找到。 backtrace
我无法获得带有间接函数的 elf 的 gnu 扩展以与 dladdr 一起工作。 在下面的例子中,fabs和sin是libm中的两个动态函数,其中sin也是一个间接函数从其指针查找 fabs 效果很好
希望这是一个相当简单的 C++ 问题(而不是语言律师问题)。 如何在 C++ 中使用 GNU 扩展 dladdr ?通常人们会用 C 编写以下内容: #ifndef _GNU_SOURCE #defi
我想在 Windows 下实现回溯实用程序的模拟,以便将此信息添加到异常中。 我需要捕获返回地址,然后将其转换为符号名称。 我知道 StackWalk64 和 StackWalker project但
我正在处理 LLVM Tutorial ,但我在编译时遇到了麻烦。我写了一个重现该问题的最小示例: #include "llvm/Module.h" #include "llvm/LLVMContex
我是一名优秀的程序员,十分优秀!