#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 ?