Я пытался использовать дезинфицирующие средства, чтобы отследить основную причину. После некоторых экспериментов (поскольку это было для меня в новинку) и оценки образца NDK мне удалось запустить наше приложение для модульного тестирования для Android с включенными дезинфицирующими средствами адресов. Однако он сообщил о проблеме в нашей оболочке libjingle (во второй строке, GetEnv) и не продвинулся дальше (так что по сути не дошёл до реальной проблемы):
Код: Выделить всё
void* jni = NULL;
jint status = g_jvm->GetEnv(&jni, JNI_VERSION_1_6); // here!
Код: Выделить всё
01-09 21:13:15.469 26761 26761 F DEBUG : tagged_addr_ctrl: 0000000000000001 (PR_TAGGED_ADDR_ENABLE)
01-09 21:13:15.470 26761 26761 F DEBUG : signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
01-09 21:13:15.470 26761 26761 F DEBUG : Abort message: '=================================================================
01-09 21:13:15.470 26761 26761 F DEBUG : ==26092==ERROR: AddressSanitizer: SEGV on unknown address 0x1680001f89a932a8 (pc 0x007a6fa365c8 bp 0x007ffaa76ed0 sp 0x007ffaa76e90 T0)
01-09 21:13:15.470 26761 26761 F DEBUG : ==26092==The signal is caused by a READ memory access.
Код: Выделить всё
Abort message: '=================================================================
#0 0x29bb25c8 /data/app/~~jBYt60JYrcx_vZkc_7_yBg==/com.test.demo.app-d3ECb5onsDtPo9mfifbLnA==/lib/arm64/libmynative.so
_JavaVM::GetEnv(void**, int)
Код: Выделить всё
--target=aarch64-none-linux-android26 --sysroot=/Users/nikola/Library/Android/sdk/ndk/android-ndk-r23/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -DANDROID_LANGUAGE_WRAPPER -DANDROID_STL=c++_shared -DTARGET_OS_ANDROID -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fexceptions -frtti -stdlib=libc++ -fsanitize-address-use-after-scope -fsanitize-recover=address -fno-optimize-sibling-calls -fsanitize=address,null -fno-omit-frame-pointer -g -fno-limit-debug-info -std=c++17 -fPIC -fvisibility=hidden -fvisibility-inlines-hiddenУ нас есть сборка ant, которая создает/компилирует собственный код, создает папку для файлов *.so в образце приложения Android и копирует его. результирующие файлы в нем.
Теперь мои вопросы следующие:
- в чем разница между -fsanitize= адрес и -fsanitize=address,null
- Я не использовал Wrap.sh в нашем проекте gradle/groovy для Android, но я все еще вижу, что дезинфицирующие средства работают. Это потому, что я вручную скопировал такие файлы, как libc++_shared.so, libclang_rt.asan-aarch64-android.so, libmytests.so и libmynative.so? Я думаю, что libmytests и libmynative скомпилированы с немного разными флагами, но по-прежнему имеют -g и -fsanitize=address (обратите внимание: не -fsanitize=address,null, а только -fsanitize=address >)
- Я предположил, что LD_PRELOAD должен быть установлен, и попытался создать Wrap.sh, но он не попал в результирующий файл APK. Я очень не уверен, где в файле build.gradle я буду ссылаться на него. Возможно, я помещаю файл не в то место — я помещаю его в libs/arm64-v8a рядом с ранее упомянутыми файлами *.so
- Как я могу проверить, есть ли Wrap.sh фактически вызывается на устройстве/эмуляторе
Подробнее здесь: https://stackoverflow.com/questions/793 ... sanitizers
Мобильная версия