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

среда, 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.

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

вторник, 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!