- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在 dlopen()
期间,什么可能导致 BUS_ADRERR
信号?我收到了很多来自不同用户的此类崩溃报告。
一些注意事项:
si_addr
信号指向加载库的地址。这让我很困惑。journalctl
没有任何兴趣。典型的崩溃报告(由 Java 生成):
Stack: [0x00007f284919b000,0x00007f284939c000], sp=0x00007f2849397258, free space=2032k
Native frames: (J=compiled Java code, A=aot compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [ld-linux-x86-64.so.2+0x1fa6f]
C [ld-linux-x86-64.so.2+0x8ffc]
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j java.lang.ClassLoader$NativeLibrary.load0(Ljava/lang/String;Z)Z+0 java.base@10.0.1
j java.lang.ClassLoader$NativeLibrary.load()Z+53 java.base@10.0.1
j java.lang.ClassLoader$NativeLibrary.loadLibrary(Ljava/lang/Class;Ljava/lang/String;Z)Z+216 java.base@10.0.1
j java.lang.ClassLoader.loadLibrary0(Ljava/lang/Class;Ljava/io/File;)Z+46 java.base@10.0.1
j java.lang.ClassLoader.loadLibrary(Ljava/lang/Class;Ljava/lang/String;Z)V+48 java.base@10.0.1
j java.lang.Runtime.load0(Ljava/lang/Class;Ljava/lang/String;)V+57 java.base@10.0.1
j java.lang.System.load(Ljava/lang/String;)V+7 java.base@10.0.1
<snip>
siginfo: si_signo: 7 (SIGBUS), si_code: 2 (BUS_ADRERR), si_addr: 0x00007f27deec7880
<snip>
7f27dec43000-7f27decc1000 r-xp 00000000 08:08 1054117 <snip>/libswt-gtk-4922r22.so
7f27decc1000-7f27deec0000 ---p 0007e000 08:08 1054117 <snip>/libswt-gtk-4922r22.so
7f27deec0000-7f27deec8000 rw-p 0007d000 08:08 1054117 <snip>/libswt-gtk-4922r22.so
7f27deec8000-7f27deecb000 r-xp 00285000 08:08 1054117 <snip>/libswt-gtk-4922r22.so
<snip>
Memory: 4k page, physical 3902428k(1540768k free), swap 3998716k(3998716k free)
最佳答案
SIGBUS
在 Linux/x86 系统上非常罕见。
发生这种情况的一种情况是 mmap
ed 文件被截断。来自 man mmap :
SIGBUS Attempted access to a portion of the buffer that does not
correspond to the file (for example, beyond the end of the
file, including the case where another process has truncated
the file).
Our application extracts the libraries from ZIP before loading them.
一个疯狂的猜测:你有一个竞争条件,你可以同时从两个单独的线程执行这个提取。
第一个线程从 ZIP 存档中提取 libswt-gtk-4922r22.so
,然后 dlopen
将其保存。 dlopen
mmap
s 文件,重新定位它,并调用库初始化程序。
当库初始化程序正在运行时,第二个线程决定必须提取库(这是错误),并在将新的(相同的)内容写入其中之前截断 .so
文件。一旦截断完成,第一个线程(仍在运行库初始化程序)就会被 SIGBUS
杀死。
通常的修复是确保“检查文件是否存在,如果不存在则提取”在关键部分完成。
关于java - dlopen() 中的 BUS_ADRERR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55589086/
每当在同一进程中使用 Linux 上的 dlopen() 函数从任何其他库加载任何新库时,我能否在我的库中获得通知?谢谢。 最佳答案 构建一个 library interposer插入 dlopen(
如果我的可执行文件调用 dlopen 来加载一个库但忽略了调用 dlclose,该库将保持加载状态直到进程退出并且操作系统强制它卸载。 如果我加载 a.so 加载 b.so,然后在 a.so 上调用
两次不同的 dlopen 和 dlclose 几次,在 dlopen 上被阻止。 卡在dlopen上,它不输出任何内容,cpuidle降至0%,并且无法通过ctrl+c退出。 LOG_TRACE("a
package com.test.nativeapp; import android.support.v7.app.ActionBarActivity; import android.os.Bundl
我在 channelReceiver.c 中使用 md5使用 jni 文件 MD5_CTX td; MD5_Init(&td); block = malloc(176); MD5_Update(&td
假设我有一个 parent 和一个 child , child 用 dlopen 在 child 中调用函数“hello”。然后 child 可以在 parent 中调用函数“world”吗?我不断收
根据文档,dlopen与 dlsym 结合使用加载库,并获取指向符号的指针。 但这已经是动态加载器/链接器所做的。 而且,这两种方法都是基于ld.so . 使用 dlopen 时实际上似乎有两个不同之
我需要从另一个程序调用一个函数。如果另一个程序是一个库,我可以简单地使用 dlopen 和 dlsym 来获取该函数的句柄。不幸的是,另一个程序是 Unix 可执行文件,并且不能将其构建为库。在可执行
我的程序使用通过 dlopen() 动态加载的插件。这些插件的位置可以是任意的,因此它们不一定在库路径中。在某些情况下,一个插件需要依赖另一个插件。因此,如果 A 和 B 是动态库,我将首先加载 A,
尝试通过 dlopen 加载模块(共享对象)时,加载失败。 比如说,我的 testshobj.c 具有以下内容: // testobj.c int dummy() { return 5; }
我正在 linux 中使用“dlopen”制作一个插件系统。有一个在插件之间传输数据(JSON)的中央应用程序。我们可以使用 try-catch 子句处理抛出的异常。我的问题是关于终止程序的错误,比如
我有一个奇怪的错误,上面写着: java.lang.UnsatisfiedLinkError: dlopen failed: cannot find "./obj/local/armeabi-v7a/
我在网上搜索后似乎找不到答案。 当我第一次使用 dlopen 时,它似乎比之后的任何时候都花费更长的时间,包括如果我从一个程序的多个实例运行它。 dlopen 是否将 so 加载到内存中一次并让操作系
在 C++ 中使用 dlopen 时,我正在努力思考工厂模式在内部是如何工作的。很抱歉发了很长的帖子。 tl;博士;问题在下面的粗体中。 来自 http://www.tldp.org/HOWTO/C+
我正在使用 dlopen 加载动态生成的代码。程序在代码上调用编译器并生成一个 .so 文件,然后程序加载该文件以扩展自身。 问题是,如果我对生成的代码使用相同的名称,dlopen 会返回旧对象的句柄
sharedlibrary通过LD_PRELOAD加载,同库的构造函数调用dlopen("libc.so.6") 问题是dlopen一直在用,调试显示如下dlopen 调用 __dlopen 调用 c
作为这篇文章的延续 C pluginsystem: symbol lookup error ,我还在写我的插件系统,遇到新的bug。 回顾一下插件是什么,该程序由一个由外壳接口(interface)的
我有一个程序调用 dlopen(使用 RTLD_NOW)来动态加载一个库,该库的完整路径在运行时指定,但程序首次执行时不知道。指定的库动态链接到另一个 .so 文件,该文件的位置直到程序启动后才知道,
除了共享对象不存在之外,dlopen 可能出现段错误的一些原因是什么? 在我的例子中,我知道共享对象存在,但是当我的程序使用 dlopen 加载它时,它会出现段错误。我检查了我的 lib 文件夹,共享
我试图让一个共享库从它被加载到的进程中调用一个函数。该库是用 C 语言编写的,即 C++ 中的“内核”。 内核.cpp: #include #include typedef void(*func_
我是一名优秀的程序员,十分优秀!