Intereting Posts
Фрагменты Android воссозданы при изменении ориентации Задание тестовых зависимостей с системой сборки Gradle Android Android конвертирует ImageReader Image в массив байтов YCbCr_420_SP (NV21), используя сценарий рендеринга? Выполнить код один раз после каждой загрузки на Android Удалить программные ограничения ориентации Catch all type exceptions для программирования Android Как предотвратить андроидное приложение от обновления из Google Play Store? Как установить высоту строки элемента в GridLayoutManager Выравнивание двух кнопок влево и вправо на Android Почему я не могу создать круглую границу для определенного угла? Использование AppCompat 'layout_behavior' с '@ string / appbar_scrolling_view_behavior' вызывает исключение Прозрачная строка состояния, не работающая с windowTranslucentNavigation = "false" Как получить национальные праздники в выбранной стране Получите температуру батареи на Android IllegalArgumentException? Зачем?

Как использовать addr2line в Android

Я застрял в своем приложении, так как не могу отлаживать его, поскольку он многопоточный, и с ошибкой SIGSEGV. Я получаю много информации из LogCat, которая дает мне адреса в моей родной библиотеке. Было бы полезно, если бы я смог конвертировать эти адреса в свой код.

Кто-нибудь знает, как использовать addr2line, который предоставляется с android-ndk?

Solutions Collecting From Web of "Как использовать addr2line в Android"

Предположим, что logcat показывает вам следующий журнал сбоев (это один из моих проектов):

I/DEBUG ( 31): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** I/DEBUG ( 31): Build fingerprint: 'generic/sdk/generic:2.3/GRH55/79397:eng/test-keys' I/DEBUG ( 31): pid: 378, tid: 386 >>> com.example.gltest <<< I/DEBUG ( 31): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000 I/DEBUG ( 31): r0 001dbdc0 r1 00000001 r2 00000000 r3 00000000 I/DEBUG ( 31): r4 00000000 r5 40a40000 r6 4051a480 r7 42ddbee8 I/DEBUG ( 31): r8 43661b24 r9 42ddbed0 10 42ddbebc fp 41e462d8 I/DEBUG ( 31): ip 00000001 sp 436619d0 lr 83a12f5d pc 8383deb4 cpsr 20000010 I/DEBUG ( 31): #00 pc 0003deb4 /data/data/com.example.gltest/lib/libnativemaprender.so I/DEBUG ( 31): #01 pc 00039b76 /data/data/com.example.gltest/lib/libnativemaprender.so I/DEBUG ( 31): #02 pc 00017d34 /system/lib/libdvm.so 

Посмотрите на последние 3 строки; Это ваш столбец. «Pc» – это программный счетчик, а pc для фрейма стека # 00 дает вам адрес, где произошел сбой. Это номер для перехода к addr2line.

Я использую NDK r5, поэтому исполняемый файл, который я использую, находится в $NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin ; Убедитесь, что он находится в вашей $PATH . Используемая команда выглядит

 arm-linux-androideabi-addr2line -C -f -e obj/local/armeabi/libXXX.so <address> 

Или, в случае выше:

 arm-linux-androideabi-addr2line -C -f -e obj/local/armeabi/libnativemaprender.so 0003deb4 

Который дает вам место аварии.

Заметка:

  • Флаг -C предназначен для демонстрации кода на C ++
  • Используйте файл .so в obj / local / armeabi, так как это не разделенная версия

Кроме того, при использовании NDK r5 с 2,3 AVD, на самом деле можно отлаживать многопоточный код.

Теперь есть более простой способ сделать это (ndk-r7). Проверьте команду ndk-stack. Документы находятся в файле you_android_ndk_path / docs / NDK-STACK.html.