【问题标题】:Native app crash - getting memory address issue - com.android.runtime/lib64/libart.so & #00 0x00000000afef03c4 <unknown>本机应用程序崩溃 - 获取内存地址问题 - com.android.runtime/lib64/libart.so & #00 0x00000000afef03c4 <unknown>
【发布时间】:2020-12-20 05:31:01
【问题描述】:

我正在将 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)、pid 12462 (eradocs.android) 中的 0xafef03c4

========================= 在堆栈跟踪中找到的崩溃转储下方

#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, 艺术::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(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction 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

谁能帮我处理这个堆栈跟踪?有没有办法找到它的根本原因?

【问题讨论】:

    标签: android android-ndk 32bit-64bit ndk-build


    【解决方案1】:

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

    请参阅 NDK 问题 #562 和这个旧的 blog post。两者都提到了这个SIGSEGV 错误。

    一些快速提示包括:

    • 检查是否定义了_BSD_SOURCE
    • 您是否升级了 NDK?
    • 你换了minSdkVersion吗?
    • 您是否从gcc 更改为Clang

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

    【讨论】:

    • 感谢您的回复。我通过链接,但在我的项目中,fopen 函数是 stdio.h。 minsdkversion 是 24
    • 您的某个库可能正在使用funopen重新映射 fopen。您必须与每个库的作者核实。
    • 有没有其他方法可以检查哪个库正在使用 funopen?此链接是否有助于检查 - developer.android.com/studio/debug/apk-debugger
    猜你喜欢
    • 2017-01-27
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多