首页 > 解决方案 > 本机应用程序崩溃 - 获取内存地址问题 - com.android.runtime/lib64/libart.so & #00 0x00000000afef03c4

问题描述

我正在将 32 位 NDK 项目迁移到 64 位。我们在项目中调用了很多库:比如 - libssl.so、libcrypto.so、libc.so、liblog.so、libcrashlytics.so

在要通过 fopen 读取内核进程的项目中,但不知何故,我收到了 FATAL 信号错误,Android 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_trampoline+144) (BuildId: d700c52998d7d76cb39e2001d670e654)

#07 0x00000000001365b8 /apex/com.android.runtime/lib64/libart.so (art_quick_invoke_static_stub+568) (BuildId: d700c52998d7d76cb39e2001d670e654)

#08 0x000000000014500c /apex/com.android.runtime/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+ 276) (BuildId: d700c52998d7d76cb39e2001d670e654)

#09 0x00000000002e2928 /apex/com.android.runtime/lib64/libart.so (art::interpreter::ArtInterpreterToCompiledCodeBridge(art::Thread*, art::ArtMethod*, art::ShadowFrame*, unsigned short, art:: JValue*)+384) (BuildId: d700c52998d7d76cb39e2001d670e654)

#10 0x00000000002ddb88 /apex/com.android.runtime/lib64/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art ::指令 const*, unsigned short, art::JValue*)+892) (BuildId: d700c52998d7d76cb39e2001d670e654)

#11 0x00000000005a28ac /apex/com.android.runtime/lib64/libart.so (MterpInvokeStatic+372) (BuildId: d700c52998d7d76cb39e2001d670e654)

#12 0x0000000000130994 /apex/com.android.runtime/lib64/libart.so (mterp_op_invoke_static+20) (BuildId: d700c52998d7d76cb39e2001d670e654)

#14 0x00000000002b3c3c /apex/com.android.runtime/lib64/libart.so

任何人都可以帮我处理这个堆栈跟踪吗?有没有办法找到这个的根本原因?

标签: androidandroid-ndk32bit-64bitndk-build

解决方案


我敢打赌,你的一个库利用了这个funopen技巧来从本机代码中读取资产。这个技巧曾经奏效,但随着 Android 和 NDK 的发展,黑客很快或多或少地过时了。我一直使用它,直到升级 NDK 并遇到类似的崩溃。

请参阅 NDK 问题#562和这篇旧博文。两者都提到了这个SIGSEGV错误。

一些快速指示包括:

  • 检查是否_BSD_SOURCE已定义。
  • 你升级了NDK吗?
  • 你改变了minSdkVersion吗?
  • 你从gcc改为Clang吗?

我对这次崩溃的解决方案是完全避免funopen


推荐阅读