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

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

Комментариев нет:

Отправить комментарий