Показаны сообщения с ярлыком android. Показать все сообщения
Показаны сообщения с ярлыком android. Показать все сообщения

среда, 26 февраля 2014 г.

SIGILL при переходе на следующую строчку после breakpoint в GDB на Android

В случае если вам хочется обойтись без Eclipse/Android Studio и прочих IDE для отладки вашего приложения для Андройда, то можно воспользоваться обычным GDB из NDK. Если вы просто подключаетесь к gdbserver'у из этого обычного GDB, то может возникнуть следующая ошибка: 

(gdb) b f_close 
Breakpoint 1 at 0x5c309018: file api/test.c, line 359.
(gdb) c
Continuing.
[New Thread 24337]
[Switching to Thread 24337]

Breakpoint 1, f_close () at api/test.c:359
359     int err = 0;
(gdb) n

Program received signal SIGILL, Illegal instruction.


Если после этого продолжить выполнение, то программа упадёт по сигналу SIGILL или SIGSEGV. В NDK есть специальный скрипт - ndk-gdb, который запускает gdbserver и делает ещё кучу других вещей. В том числе он исправляет эту проблему.

Решение


Загрузите с вашего Андройд-устройства следующие файлы:

* /system/lib/libc.so
* /system/bin/app_process
* /system/bin/linker
И поместите их в папку с вашими бинарниками на хосте (например ./obj/local/armeabi/). После этого воспользуйтесь следующими командами для подключения к gdbserver'у:


file obj/local/armeabi/app_process
target remote :5039
set solib-search-path obj/local/armeabi/

Убедитесь что бинарники подгрузились с помощью команд info sharedlibrary и info file.

Теперь можно пошагово выполнять приложение без проблем!

четверг, 31 января 2013 г.

Android glxinfo

Под катом находятся исходники простой утилиты, выводящей информацию об OpenGL в Android 4.

Обратите внимание что код расчитан на компиляцию системой сборки Android (вам понадобятся исходники платформы чтобы собрать). Я не пробовал собирать с помощью NDK.

Например она выводит следуюущую информацию, если запущена на PandaBoard Rev.B ES:
EGL version 1.4
EGL_VERSION = 1.4 Android META-EGL
EGL_VENDOR = Android
EGL_EXTENSIONS = EGL_KHR_image EGL_KHR_image_base EGL_KHR_image_base 
EGL_KHR_gl_texture_2D_image EGL_KHR_gl_texture_cubemap_image EGL_KHR_gl_renderbuffer_image 
EGL_KHR_fence_sync EGL_ANDROID_image_native_buffer EGL_ANDROID_image_native_buffer
EGL_CLIENT_APIS = OpenGL ES
На эмуляторе Android 4.0:
EGL version 1.4
EGL_VERSION = 1.4 Android META-EGL
EGL_VENDOR = Android
EGL_EXTENSIONS = EGL_KHR_image EGL_KHR_image_base EGL_KHR_image_pixmap 
EGL_KHR_gl_texture_2D_image EGL_KHR_gl_texture_cubemap_image EGL_KHR_gl_renderbuffer_image 
EGL_KHR_fence_sync EGL_ANDROID_image_native_buffer EGL_ANDROID_swap_rectangle 
EGL_NV_system_time
EGL_CLIENT_APIS = OpenGL ES

пятница, 7 сентября 2012 г.

Управление демонами в Android

Во время загрузки андройда процесс init запускает целый ряд "демонов", описанных в файле /init.rc. Демоны отличаются от обычных линуксовых процессов только тем, что за ними следит  init -- он может их перезапускать в случае гибели, а так же запускать/останавливать по команде пользователя. Команды выглядят вот так:
# setprop ctl.start $SERVICENAME $ARGS
# setprop ctl.stop $SERVICENAME
# setprop ctl.restart $SERVICENAME
Где $SERVICENAME это имя демона, определённое в файле init.rc. $ARGS это аргументы, которые будут переданы запускаемому процессу.
Например, при запущенном эмуляторе можно сделать так:
adb shell setprop ctl.restart ril-daemon
Это команда перезапустит демон radio interface layer.

Ссылки


вторник, 22 ноября 2011 г.

Отладка приложений в Android с помощью gdbserver

Это руководство может быть полезным тем, кто собрал на своей машине платформу Android, запустил её на устройстве/эмуляторе и хочет отлаживать на ней родные приложения. Необходимость собственноручной компиляции андройда обусловлена тем, что в процессе сборки генерируются отладочные символы для всех исполняемых файлов и библиотек. Они складываются в директорию out/target/product/generic/symbols/*. Подцепив эти символы в GDB можно отлаживать любые системные сервисы/приложения/библиотеки.
adb shell gdbserver :5039 --attach 2055 & ❶

adb forward "tcp:5039" "tcp:5039" ❷
${CROSS_COMPILE}gdb ❸
(gdb) target remote :5039 ❹
(gdb) set solib-search-path out/target/product/generic/symbols/system/lib ❺
(gdb) info sharedlibrary ❻
  1. Запускаем gdbserver на порту 5039. Параметр --attach заставляет его подключиться к запущенному процессу с PID = 2055. Чтобы узнать PID подопытного процесса, пишем "adb shell ps"
  2. Перебрасываем порт 5039 на устройстве на локальный порт компьютера, с которого производятся команды
  3. Запускаем gdb. Переменная CROSS_COMPILE должна указывать на gdb для архитектуры целевого устройства (обычно это ARM). Нужный нам gdb можно найти в папке $DROID/prebuilt/linux-x86/toolchain/arm-eabi*
  4. Теперь выполняем команду GDB -- просим его подключиться к локальному порту 5039 (подключение подхватит ADB и соединит нас с портом 5039 устройства, на котором висит gdbserver)
  5. Указываем папку, где можно взять отладочные символы. В нашем случае они указаны только для динамических библиотек. 
  6. Последняя команда загружает символы. На этом этапе мы готовы к работе. Пишем continue и/или ставим brakepoints!

понедельник, 31 октября 2011 г.

Отладка сервисов в Android

Чтобы Eclipse начал останавливаться в точках останова, надо перед такой точкой вставить следующую строку:
android.os.Debug.waitForDebugger();

Так же в манифесте надо прописать android:debuggable="true"