Как заставить ndk-gdb работать на Android?

Я пытаюсь заставить отладчик NDK работать, но пока не добился успеха.

Чтобы убедиться, что мои отладочные символы присутствуют и действительны, я использую параметры компилятора -O0 и -g, а параметр ndk-build NDK_DEBUG = 1.

Скрипт ndk-gdb запускается без проблем и запускает GDB. Когда команда «sharedlibrary», я получаю следующее:

Symbols already loaded for /bla/bla/libMySharedLib.so 

Однако, когда я пытаюсь выполнить выполнение или, например, добавить segfault для тестирования, я никогда не получаю никаких символов из этой библиотеки в стеке вызовов. Единственные символы, которые я получил, – это libc, если я нарушаю исполнение, пока он ждет мьютекса. Также попытался добавить точки останова без везения. GDB позволяет мне добавлять точки останова, и код работает нормально, но точки останова никогда не запускаются.

Я использую API-уровень 8, так как мне нужно поддерживать Android 2.2 (Froyo).

Вам не нужно использовать переключатели -O0 или -g. Вам нужно сделать следующее:

  1. поместите android:debuggable="true" в в файле AndroidManifest.xml
  2. используйте NDK_DEBUG=1 после ndk-build
  3. put APP_OPTIM := debug в файле Application.mk

Выполнение любой из этих трех вещей автоматически будет использовать переключатели -O0 и -g.

Можете ли вы попробовать запустить gdb вручную, без скрипта gdb? Он включает следующие шаги:

  1. нажатие файла gdbserver на /data/local folder на устройстве
  2. запуская ваше приложение и вызывая в adb shell следующую команду gdbserver :5055 --attach PID , где PID – это ваш идентификатор процесса приложения.
  3. запуск adb forward tcp:5055 tcp:5055 на хосте
  4. запустить arm-linux-androideabi-gdb.exe из папки вашего приложения
  5. ввод следующих команд в gdb
  6. set solib-search-path obj/local/armeabi
  7. file obj/local/armeabi/libMySharedLib.so
  8. target remote :5055

И посмотрим, сможете ли вы отлаживать тогда.

Если вы хотите видеть символы для других разделяемых библиотек, которые использует ваша библиотека, например libc.so , вытащите их из устройства (из папки /system/lib ) в свою папку obj/local/armeabi .

Давайте будем гением компьютера.