dlopen 崩溃(接收 SIGBUS)

Posted

技术标签:

【中文标题】dlopen 崩溃(接收 SIGBUS)【英文标题】:Crash in dlopen ( receiving SIGBUS ) 【发布时间】:2015-10-11 05:35:00 【问题描述】:

我的一个应用程序由于 SIGBUS 信号而崩溃。 以下是来自 gdb 的堆栈跟踪。基本上, dlopen 调用失败了。我正在运行 CentOS 6.3 64 位。

Program received signal SIGBUS, Bus error.
0x0000003cfc6175de in strcpy () from /lib64/ld-linux-x86-64.so.2
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.149.el6_6.9.x86_64 libgcc-4.4.7-11.el6.x86_64 libstdc++-4.4.7-11.el6.x86_64
(gdb) bt
#0  0x0000003cfc6175de in strcpy () from /lib64/ld-linux-x86-64.so.2
#1  0x0000003cfc6090b2 in _dl_load_cache_lookup () from /lib64/ld-linux-x86-64.so.2
#2  0x0000003cfc608612 in _dl_map_object () from /lib64/ld-linux-x86-64.so.2
#3  0x0000003cfc612b05 in dl_open_worker () from /lib64/ld-linux-x86-64.so.2
#4  0x0000003cfc60e266 in _dl_catch_error () from /lib64/ld-linux-x86-64.so.2
#5  0x0000003cfc6125aa in _dl_open () from /lib64/ld-linux-x86-64.so.2
#6  0x0000003cfca00f66 in dlopen_doit () from /lib64/libdl.so.2
#7  0x0000003cfc60e266 in _dl_catch_error () from /lib64/ld-linux-x86-64.so.2
#8  0x0000003cfca0129c in _dlerror_run () from /lib64/libdl.so.2
#9  0x0000003cfca00ee1 in dlopen@@GLIBC_2.2.5 () from /lib64/libdl.so.2
#10 0x00000000004b4425 in my_open_dbus_func (f_name=0x558f2d "libdbus-glib-1.so.2")

我尝试用这两行代码编写一个简单的程序,效果很好:

void * h = dlopen( "libdbus-glib-1.so.2", RTLD_LAZY );
dlclose( h );

我还尝试在 valgrind 下运行我的原始应用程序,它没有任何问题。

非常感谢任何帮助/指针。

【问题讨论】:

你能再给我们看一些代码吗?你能提供一个最小的、独立的例子吗? 您能否更改您的简单程序以使用RTLD_NOW 而不是RTLD_LAZY 并让我们知道这是否有效。也只是好奇nm 对共享库报告了什么 因为strcpy() 中的代码似乎失败了,我敢说这很可能是由于在相关调用 (dlopen()) 之前发生的内存管理损坏所致。 如何按照它在错误中告诉您的操作?使用调试信息安装? SIGBUS 的一个代码是BUS_ADRALN,地址对齐。 strcpy() 是崩溃的函数,可能是复制名称。指针f_name 未与 64 位边界对齐,对吗?这有关系吗? 【参考方案1】:

似乎其中一个静态库(来自第三方 vedor)正在执行不正当的内存管理,这不知何故导致我的 dlopen 调用崩溃。编写代码是为了消除虚拟环境。在 valgrind 上很容易检测到该问题,但如果应用程序在 valgrind 下运行,第三方库将采用不同的代码路径(考虑到 valgrind 是物理机)

不幸的是,我不知道他们在静态库中修复了什么,但它似乎有效。我正在写这个答案(并接受它)以避免进一步的混淆。

【讨论】:

【参考方案2】:

尝试检查dlopen之后的h是否不为NULL。我可能会假设dlclose 可能会因作为参数给出的 NULL 指针而崩溃。

【讨论】:

以上是关于dlopen 崩溃(接收 SIGBUS)的主要内容,如果未能解决你的问题,请参考以下文章

Native崩溃说明 so库崩溃SIGBUS(bad memory access) 和 SIGSEGV(Invalid memory reference)

Native崩溃说明 so库崩溃SIGBUS(bad memory access) 和 SIGSEGV(Invalid memory reference)

应用随机崩溃与致命信号7(SIGBUS),代码2或致命信号11(SIGSEGV),代码1

间歇性 Android 应用程序崩溃 java.lang.UnsatisfiedLinkError: dlopen failed

基于 Qt 的 android 应用程序在一台特定设备上启动时崩溃。 “dlopen 失败:libqtforandroid”

切换后台任务时SIGPIPE崩溃