Отладка Android NDK, под windows

Я переношу сложное приложение C на Android в виде библиотеки SO, обернутой тонким слоем java. После нескольких часов хлопот у меня компилируется код под Android, но, конечно же, приложение вылетает :(

Посмотрев вокруг, я понял, что единственный способ отлаживать приложение C под Android — это gdb. Поскольку у меня нет большого опыта работы с gdb, кто-нибудь может поделиться некоторыми соображениями?

У кого-нибудь есть учебник по gdb под окнами :)?

Спасибо


person Noam    schedule 13.07.2010    source источник
comment
красиво, но я не могу зайти :(   -  person Noam    schedule 14.07.2010
comment
@ognian ваша учетная запись со ссылкой приостановлена ​​​​... лол, я бы тоже не хотел знать ответ на этот вопрос, поскольку я перешел по ссылке ответов и обнаружил, что решение тоже не работает.   -  person JPM    schedule 07.12.2011


Ответы (1)


для более поздней версии NDK (я использую r7c) вы можете собрать отладочную версию с помощью

  1. добавить флаг android:debuggable="true" к тегу <Application> в AndroidManifest.xml
  2. вызывать ndk-build с NDK_DEBUG=1 (флаг NDK_DEBUG не требуется, если ndk-build запущен с оболочкой unix)

в Windows все становится немного сложнее, потому что для использования ndk-gdb вам все еще нужен bash (или cygwin) с NDK r7c, но ndk-build, работающий в cygwin bash, столкнется с проблемой разрешения, если вы когда-либо используете любую из предварительно созданных статических библиотек

мое решение на Windows-машине

  1. добавить флаг android:debuggable="true" к тегу <application в AndroidManifest.xml (как указано выше)
  2. в cmd (командная строка Windows): вызовите ndk-build с NDK_DEBUG=1
  3. в cygwin bash: запустите ndk-gdb

для быстрого начального исследования родной библиотеки so создайте простое действие с одной кнопкой для запуска функции входа в библиотеку и loadLibrary в действии, например:

class MyActivity extends Activity {
    static {
       System.loadLibrary("mylibrary");
    }

    /* other functions like onCreate, etc... */

    public native void libfunc();

    public void onClick(View v){
       libfunc();
    }
}

Таким образом, когда gdb запускается, рассматриваемая библиотека фактически загружается, но у вас еще есть время установить точки останова и т. д., прежде чем программа вылетит; когда вы закончите настройку отладчика, в приглашении (gdb) введите continue (или просто 'c'), затем нажмите кнопку, чтобы запустить аварийную программу и удачной отладки...

person Yenchi    schedule 25.04.2012