Интеграция работы с нативным кодом на С/С++ для android в Eclipce (на примере, под Ubuntu). — часть 3

Настройка Eclipse для отладки нативного кода проекта.

Начало…

1) Устанавливаем breakepoint после загрузки библиотеки и перед вызовом нативной функции, запускаем проект на отладку и ждем его остановки на breakepoint. Если хотите можно переключится и Debag перспективу, это сейчас не важно.
2) Запускаем терминал переходим в директорию Вашего проекта и вводим команду ndk-gdb. Данная команда запустила скрипт который сгенерировал сервер gbd отладчика в папке obj/local/armearbi. Теперь можно выйти из него в терминале.
3) Собственно теперь нам необходимо перейти в директорию obj/local/armearb проекта(хотя вроде уже там) и создать копию файла gdb.setup назвав ее gdb2.setup.
4) Теперь необходимо отредактировать файл наш gdb2.setup. А именно в нем просто удалить последнюю строчку: «target remote :5039». Эти параметры мы укажем позже при настройке Eclipce, там требуется.
5) Переходим в директорию с ndk и создаем в ней опять копию файла ndk-gdb назвав к примеру его ndk-gdb-eclipse.
6) Редактируем файл ndk-gdb-eclipse, нам необходимо удалить или закомментировать последнюю 581 строку скрипта чтобы конец файла приобрел к примеру следующий вид:

echo "file `native_path $APP_PROCESS`" >> $GDBSETUP 
echo "target remote :$DEBUG_PORT" >> $GDBSETUP 
if [ -n "$OPTION_EXEC" ] ; then 
    cat $OPTION_EXEC >> $GDBSETUP 
fi 
##$GDBCLIENT -x `native_path $GDBSETUP`

7) Настройка проекта Eclipse для отладки. Создаем новую Debug configuration, назвав ее как нибудь осмысленно (например «NativeExample native debug»). Совет: переименуйте отладочную конфигурацию для андроида тоже в что нибудь осмысленное.
На закладке main в поле С/С++ Aplication указываем путь к сгенерированому gdb приложению в папке проекта obj/local/armearbi — «app_process».
Необходимо также выбрать Standard Create Process Launcher нажав на синюю ссылку внизу окна Select other… .

В закладке Debugger в поле Debugger указываем gdbserver. В поле Stop on startup название нативной функции при входе в которую отладчик остановится, в нашем случае это Java_com_example_NativeLib_function.
В поле GDB debugger указываем путь к gdb для андроида ${ndk_dir}/ toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gdb. В поле GDB command line нам необходимо указать путь к созданному нами файлу gdb2.setup.

В закладке Connection выставляем TCP localhost 5039.
И на всякий случай проверяем что бы в закладке Common у Вас стояла галочка в Debug конфигурации.

Отладка проекта в Eclipse.

1) Ставим точку в Java коде проекта перед вызовом нативной функции после загрузки библиотеки, запускаем АНДРОИД конфигурацию для отладки и ждем остановки на breakpoint’е, переходим в Debug перспективу Eclipse.
2) Из терминала в директории проекта выполняем команду ndk-gdb-eclipse, которая запускает gdb сервер для нашего проекта
3) Переходим в Eclipse запускаем нативную конфигурацию для отладки: Стрелочка возле жука вниз и выбираем нужную нам конфигурациюв нашем случае «NativeExample native debug»
4) И жмем кнопку Resume (зеленую стрелочку) в Debug перспективе.

Все 😉 Вас переключило в отладку нативного кода в самое начало функции как мы и хотели.
Теперь можно устанавливать в С/С++ breakpoint’ы и отлаживать нативный код.

Честно говоря когда была написана половина данной статьи нашел блог из которого почерпнул для себя много интересного. Часть этого вошло в статью 🙂 .

Реклама

Детали luchaninov
небритый темный и злой - иногда

19 Responses to Интеграция работы с нативным кодом на С/С++ для android в Eclipce (на примере, под Ubuntu). — часть 3

  1. 1 says:

    А для отладки нативного кода на телефоне нужен root?

  2. luchaninov says:

    Честно говоря сам не пробовал — у меня свой девайс 2.1, а на работе 2.3.3 не всегда под рукой. Не хотелось заморачиватся , но читал что да («Due to permissions limitation it is only possible on rooted devices»).

  3. sacred says:

    те для каждого метода нужно каждый раз менять это:

    >В закладке Debugger в поле Debugger указываем gdbserver. В поле Stop on startup >название нативной функции при входе в которую отладчик остановится, в нашем случае > это Java_com_example_NativeLib_function.

    ???

    • luchaninov says:

      Нет, это только для удобства, можно вообще не указывать — тогда остановится на брейкпоинте.

  4. sacred says:

    и еще вопрос:
    я вошел в сишный метод. после return отладчик не возвращается в java код.
    есть ли способ после си кода вернуться в

  5. luchaninov says:

    Этот отладчик и не вернется ява код у вас дебажится в другом окне — переключите окно дебага

    • sacred says:

      решил проблему так: на строчке с return нажимаю resume (f8). это возвращает на java debug

    • sacred says:

      > Этот отладчик и не вернется ява код у вас дебажится в другом окне – переключите окно дебага

      а смысл? си отладка типа идет, а java ждет ее окончания. те просто переключение на другую перспективу ничего не дает

  6. luchaninov says:

    И самое главное дебажить С код на андроиде нужно только в крайнем случае — если библиотека позволяет лучше отладите ее на отдельном сишном проекте 😉

    • sacred says:

      просто есть проблемы с производительностью проекта на слабых девайсах. и было предложено попробовать перенести отрисовку в ndk, но коллега уверял что тогда отлаживать будет невозможно, только логировать действия. вот собсно и был найден ваш блог и применена эта статья. спс

  7. sacred says:

    и еще такой вопрос: вот запустили мы на дебаг java код. потом запустили gdbserver из консоли. потом в еклипсе стартанули си дебаг профиль. получается что я теперь также дебажу java код, но могу на вызове native метода сделать f5 — те войти в него , а если я не стартану си дебаг то f5 на native методе ничего не даст. так ведь ? или я что-то не так понял

    • luchaninov says:

      угу, ява профиль ничего не знает как к Gdb подключатся

      • sacred says:

        а тогда что дадут брекпоинты в си коде ? при запуске си дебага я сразу же перейду на брекпоинт ?

  8. luchaninov says:

    думаю что ничего не дадут 😉 просто не остановится и все

  9. qwerty says:

    У меня в Eclipse при сборке нативного кода ничего не выводится в консоль. Т.е. вообще, все собирается где-то в фоне.

    Как быть?

    • luchaninov says:

      Просто, переключите окно консоли в эклипсе

      • qwerty says:

        Уже исправил, проблема в другом была
        Надо было отдельно builder для ndk прописать(я под виндой)
        Нативный код не компилился соответсвенно и консоли не было 🙂

  10. Евгений says:

    Хороший добрый человек ! Спасибо тебе от всей души ! Делаю игру параллельно для айфона и для андроида. Теперь запросто можно будет на андроиде дебажиться. Да пожалуй и всю разработку перетащу теперь в родной и удобный эклипс. Ибо XCode просто ненавижу до такой степени, что не понимаю почему яблочники вообще не забросили эту разработку и не пересели на эклипс.

  11. Евгений says:

    Коллеги, еще такой момент не подскажите ? Почему-то на нативном коде дебагер страшно тормозит. Нажимаешь на F6, после чего приходится ждать секунд 5-10, пока выполнится шаг отладки. Я сначала грешным делом подумал, что отладка на девайсе удаленная, по USB, но потом сообразил, что код на яве отлаживается с вполне приемлемой скоростью. Значит дело в чем-то другом. Подробно я пока не разбирался. Но возможно у кого-то был тот же баг и возможно его кто-то уже пофиксил. Не посоветуете что делать ?

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: