我正在将32位NDK项目迁移到64位。我们在项目中调用了许多库:如-libssl.so、libcrypto.so、libc.so、liblog.so、librcrashlytics.so
在这个项目中,我将通过fopen读取内核进程,但不知怎么的,我得到了致命信号错误和安卓logcat显示如下
A/libc:致命信号11(SIGSEGV(,代码1(SEGV_MAPERR(,故障地址tid 12462(eradocs.android(中的0xafef03c4,pid 12462(eradocs.android(
========================在堆栈跟踪上发现以下崩溃转储
#00 0x00000000afef03c4-此内存地址与上述致命信号错误匹配。
#06 0x000000000013f350/apex/com.android.runtime/lib64/libart.so(art_quick_generic_jni_蹦床+144((构建ID:d700c52998d7d76cb39e2001d670e654(
#07 0x00000000001365b8/apex/com.android.runtime/lib64/libart.so(art_quick_invoke_static_stub+568((构建ID:d700c52998d7d76cb39e2001d670e654(
#08 0x000000000014500c/apex/com.android.runtime/lib64/libart.so,art::JValue*,char const*(+276((BuildId:d700c52998d7d76cb39e2001d670e654(
#09 0x00000000002e2928/apex/com.android.runtime/lib64/libart.so(艺术::解释器:艺术解释器到编译代码桥(艺术:线程*,art::ArtMethod*,art::ShadowFrame*,无符号短字符,art:(JValue*(+384((建筑ID:d700c52998d7d76cb39e2001d670e654(
#10 0x00000000002ddb88/apex/com.android.runtime/lib64/libart.so(布尔艺术::解释器::DoCall<false,false>(艺术::艺术方法*,艺术::线程*,art::ShadowFrame&,art::指令const*,无符号short,art::JValue*(+892((BuildId:d700c52998d7d76cb39e2001d670e654(
#11 0x00000000005a28ac/apex/com.android.runtime/lib64/libart.so(MterInvokeStatic+372((构建ID:d700c52998d7d76cb39e2001d670e654(
#12 0x0000000000130994/apex/com.android.runtime/lib64/libart.so(mterp_invoke_static+20((构建ID:d700c52998d7d76cb39e2001d670e654(
#14 0x00000000002b3c3c/apex/com.android.runtime/lib64/libart.so
有人能帮我做这个堆叠竞赛吗?有没有办法找到造成这种情况的根本原因?
我敢打赌,您的一个库利用了funopen
技巧,能够从本机代码中读取资产。这个技巧曾经奏效,但随着Android和NDK的发展,黑客很快就或多或少地过时了。我一直使用它,直到我升级了NDK,并遇到了类似的崩溃。
请参阅NDK第562期和这篇旧博客文章。两者都提到了这个SIGSEGV
错误。
一些快速指针包括:
- 检查是否定义了
_BSD_SOURCE
- 你升级NDK了吗
- 您是否更改了
minSdkVersion
- 您是否从
gcc
更改为Clang
我对此崩溃的解决方案是完全避免funopen
。