Сбой родного приложения — проблема с адресом памяти — com.android.runtime /lib64 / libart.so

#android #android-ndk #32bit-64bit #ndk-build

#Android #android-ndk #32-битный-64-битный #ndk-сборка

Вопрос:

Я работаю над переносом 32-битного проекта NDK на 64-битный. Мы вызываем так много библиотек в проектах: например — libssl.so , libcrypto.so , libc.so , liblog.so , libcrashlytics.so

В проекте собираюсь прочитать процесс ядра с помощью fopen, но почему-то я получаю ФАТАЛЬНУЮ ошибку сигнала, и Android logcat отображается, как показано ниже

A / libc: фатальный сигнал 11 (SIGSEGV), код 1 (SEGV_MAPERR), ошибка addr 0xafef03c4 в tid 12462 (eradocs.android), 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::ShadowFrameamp;, 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

Кто-нибудь может помочь мне с этим отслеживанием стека? Есть ли способ найти основную причину этого?

Ответ №1:

Бьюсь об заклад, одна из ваших библиотек использует funopen трюк, позволяющий считывать ресурсы из собственного кода. Раньше этот трюк работал, но по мере развития Android и NDK взлом вскоре стал более или менее устаревшим. Я использовал его, пока не обновил NDK и не получил аналогичный сбой.

Смотрите проблему NDK # 562 и это старое сообщение в блоге. В обоих упоминается эта SIGSEGV ошибка.

Некоторые быстрые указания включают:

  • Проверьте, _BSD_SOURCE определено ли.
  • Вы обновили NDK?
  • Вы изменились minSdkVersion ?
  • Вы изменили с gcc на Clang ?

Мое решение этого сбоя состояло в том, чтобы полностью избежать funopen .

Комментарии:

1. Спасибо за ответ. Я перехожу по ссылке, но в моем проекте функция fopen имеет стандартную версию.h. minsdkversion равна 24

2.Возможно, одна из ваших библиотек используется funopen для повторного отображения fopen . Вы должны проконсультироваться с авторами каждой из библиотек.

3. есть ли какой-либо другой способ проверить, какая библиотека использует funopen? Полезно ли проверять эту ссылку — developer.android.com/studio/debug/apk-debugger ?