Символы не синхронизированы при перекрестной отладке android ndk

Я пытаюсь отладить собственный встроенный (NDK) исполняемый тест (+ общая библиотека), используя оболочку adb, gdbserver с одной стороны и gdb ndk с другой стороны.

Я скопировал исполняемый файл и .so на устройство и выполнил в оболочке adb:

$ gdbserver :5039 ./my_test my_args
Process ./my_test created; pid = 11131
Listening on port 5039

На хосте я запускаю gdb с тем же исполняемым файлом my_test:

$ $NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gdb ./my_test

И поставьте точку останова в main():

Reading symbols from /.../my_test...done.
(gdb) target remote :5039
Remote debugging using :5039
warning: Unable to find dynamic linker breakpoint function.
GDB will retry eventurally.  Meanwhile, it is likely
that GDB is unable to debug shared library initializers
or resolve pending breakpoints after dlopen().
0xb6f71a60 in ?? ()
(gdb) b main
Cannot access memory at address 0x0
warning: (Internal error: pc 0xa468 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0xa468 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0xa468 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0xa46c in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0xa468 in read in psymtab, but not in symtab.)

...

При подключении к eclipse в качестве удаленной отладки «следующий оператор» переходит в разные места кода, когда я пытаюсь выполнить пошаговый код. Это то же самое, что я вижу, когда выполняю серию команд «следующая» в gdb.

Версия gdbserver на устройстве 7.6.

Любые идеи?

Обновление:

После сборки gdb 7.6.2 и использования его вместо gdb 7.3.1-gg, который поставляется с выпуском NDK, который у меня есть (r9d 64-бит), эти предупреждающие сообщения о внутренней ошибке исчезли.

Остается отсутствие синхронизации между кодом и отладкой. Я построил код с NDK_DEBUG=1 и скопировал исполняемый файл и .so из каталога .obj на устройство, но все же, когда я выполняю «пошаговую» отладку из gdb+gdbserver, поток программы, как видно из gdb, не иметь смысл.


person miluz    schedule 27.08.2014    source источник
comment
Вы можете попробовать нажать gdb вашего ndk и использовать его. Как быстрый взлом, есть ли шанс, что вы могли бы переименовать (или обернуть) свою основную функцию, чтобы сделать ее jni-совместимой и иметь пустое java-приложение, которое создает поток и вызывает в нем ваш собственный код, позволяя вам использовать обычную процедуру отладки ndk? Вы также можете попробовать выполнить обычный сеанс отладки ndk в образце приложения, наблюдая за тем, что именно происходит — параметры и команды gdb и т. д. Другой вариант, который часто бывает эффективным, — это просто создать свой код для машины разработки и отладить его там. .   -  person Chris Stratton    schedule 27.08.2014


Ответы (1)


Хорошо, проблема решена. Теперь поток программы, как видно из gdb, выглядит так, как ожидалось.

Вот две вещи, которые были сделаны и заставили его работать:

  1. Соберите более новую версию gdb. Вместо версии 7.3.1, поставляемой с выпуском NDK (версия r9d), я скачал и собрал gdb с помощью --target=arm-linux-gnueabi и использовал его.

  2. Раньше я указывал -g в APP_CPPFLAGS внутри Application.mk. На этот раз я указал -ggdb -O0.

person miluz    schedule 01.09.2014