Android NDK «wrap.sh» и использование дезинфицирующих средствAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android NDK «wrap.sh» и использование дезинфицирующих средств

Сообщение Anonymous »

В течение некоторого времени я пытаюсь устранить ошибку в нашей собственной общей библиотеке C++ с помощью трассировок, но ее нелегко воспроизвести (учитывается многопоточность/сетевое взаимодействие). У нас есть код Android (Java), создающий экземпляр C++ через JNI. Затем этот код C++, в свою очередь, вызывает сеть Java в отдельном потоке, сканирует сетевые интерфейсы, выполняет некоторую логику и возвращает результаты с помощью JNI обратно в Android. Я знаю, это может показаться странным, но его старую архитектуру мы не можем изменить, по крайней мере, нелегко. На платформах ARM64 время от времени возникает фатальный сигнал 11 (SIGSEGV), код 1 (SEGV_MAPERR), адрес ошибки 0x493e000000002 в tid 21973 (myapp), pid 21973 (myap). Не всегда по одному и тому же адресу, но часто это один и тот же адрес.
Я пытался использовать дезинфицирующие средства, чтобы отследить основную причину. После некоторых экспериментов (поскольку это было для меня в новинку) и оценки образца 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»