Russian Qt Forum

Qt => Qt Embedded => Тема начата: xintrea от Январь 04, 2014, 13:34



Название: [Решено] Есть Android-планшет, закомпилил Qt 5.2 прогу, запустил. Как дебажить?
Отправлено: xintrea от Январь 04, 2014, 13:34
Интро

На новый год задарили мне Андроид-планшет. Решил я попробовать скомпилировать свою программу в Qt 5.2 (ранее собирал под Qt 4.7 и 4.8 ).

Сие действие неожиданно легко получилось с минимальными исправлениями:

https://github.com/xintrea/mytetra_dev/commit/3c70dfd3af1f4de50c19e7848f7a5e4872a02c19

И что самое интересное, компиляция нормально прошла под ARM7, и даже сформировался файл *.apk с пакетом программы.

Офигев от такого поворота, я по свежей памяти записал всю последовательность действий, какие инструменты ставить для компиляции под Android в Qt 5.2, где, что и как настраивать:

http://webhamster.ru/mytetrashare/index/mtb0/1389188506pjpk70s9qf



Запуск

Залил программу на девайс, установил, запустил. Увидел первый экран приветствия. После нажатия OK программа должна была разворачивать свои файлы в пользовательской директории и показать свой основной экран.

Не знаю, развернулись файлы или нет, ибо далее лицезрею пустой черный экран.

Теперь мне нужно понять, что происходит с программой. Поэтому есть несколько вопросов.



Вопросы

1. Программа сыплет отладочными сообщениями в стандартный поток. Вопрос. Как запустить программу так, чтобы увидеть эти отладочные сообщения?



2. Через ADB я могу подконнектиться к планшету (в котором я пока не разобрался, как получить root, и нужен ли он для отладки). Я могу подключиться через ADB и к эмулятору, в котором есть root. В эмуляторе (рутованном) я могу запустить мою программу, и заглянуть в каталог

/data/data/org.qtproject.example.mytetra/files

но там (и в окрестностях) я не вижу рабочих файлов, которые должна была создать моя программа.

Вопрос. Можно ли как-то из ADB дать команду на запуск программы? Возможно тогда я увижу лог в ADB консоли. Не могу понять, какой бинарник нужно запускать и где он лежит.



3. Кто-нибудь знает, как запускать отладку Андроид-приложений из Qt Creator 3.0.0? У меня не получилось. Мне нужно точно знать последовательность действий.


Название: Re: Задарили Android-планшет, закомпилил прогу на Qt 5.2, запустил. А как дебажить?
Отправлено: Old от Январь 04, 2014, 14:19
Я просто устанавливаю точки останова и нажимаю начать отладку. Программа запускается на андроиде и я могу выполнять ее пошагово.
Кстати, все отладочные сообщения передаются и выводятся в окне QtCreator.


Название: Re: Задарили Android-планшет, закомпилил прогу на Qt 5.2, запустил. А как дебажить?
Отправлено: xintrea от Январь 04, 2014, 16:00
Я просто устанавливаю точки останова и нажимаю начать отладку. Программа запускается на андроиде и я могу выполнять ее пошагово.
Кстати, все отладочные сообщения передаются и выводятся в окне QtCreator.

Блин, а у меня не останавливается отладка на брекпоинтах. Даже не знаю что делать.



Название: Re: Задарили Android-планшет, закомпилил прогу на Qt 5.2, запустил. А как дебажить?
Отправлено: xintrea от Январь 04, 2014, 22:01
Кстати, все отладочные сообщения передаются и выводятся в окне QtCreator.

Два вопроса, мне очень важно знать оба ответа:

1. У тебя видны в QtCreator сообщения через qDebug()?

2. У тебя видны в QtCreator сообщения через printf()?


Название: Re: Задарили Android-планшет, закомпилил прогу на Qt 5.2, запустил. А как дебажить?
Отправлено: Old от Январь 04, 2014, 23:39
1. У тебя видны в QtCreator сообщения через qDebug()?
Да.

2. У тебя видны в QtCreator сообщения через printf()?
Нет.


Название: Re: Задарили Android-планшет, закомпилил прогу на Qt 5.2, запустил. А как дебажить?
Отправлено: xintrea от Январь 05, 2014, 00:34
1. У тебя видны в QtCreator сообщения через qDebug()?
Да.

2. У тебя видны в QtCreator сообщения через printf()?
Нет.

Ага, спасибо.

Выходит, что под Андроидом нельзя подменить обработчик qDebug() через код:

Код:
   #if QT_VERSION < 0x050000
    qInstallMsgHandler(myMessageOutput);
   #else
    qInstallMessageHandler(myMessageOutput);
   #endif

потому что

1. Если в обработчике выводить в консоль через printf() или через fprintf(stderr, "[DBG] %s\n", msg); то этот вывод не получит отладчик QtCreator.

2. Если в переопределенном обработчике таки вызвать qDebug(), то исходя из того, что обработчик переопределен, вместо qDebug() будет вызван опять тот же самый обработчик, и получится бесконечная рекурсия.


Название: Re: Задарили Android-планшет, закомпилил прогу на Qt 5.2, запустил. А как дебажить?
Отправлено: LisandreL от Январь 05, 2014, 19:25
Выходит, что под Андроидом нельзя подменить обработчик qDebug() через код:

Код:
   #if QT_VERSION < 0x050000
    qInstallMsgHandler(myMessageOutput);
   #else
    qInstallMessageHandler(myMessageOutput);
   #endif

потому что

1. Если в обработчике выводить в консоль через printf() или через fprintf(stderr, "[DBG] %s\n", msg); то этот вывод не получит отладчик QtCreator.

2. Если в переопределенном обработчике таки вызвать qDebug(), то исходя из того, что обработчик переопределен, вместо qDebug() будет вызван опять тот же самый обработчик, и получится бесконечная рекурсия.

Ну вообще-то qInstallMsgHandler должен возвращать указатель на предыдущий обработчик. Соотвественно при установке своего обработчика сохраняем оригинальный и вызываем его.
Правда использовал такой подход в гуёвом приложении - работало, а вот в консольном приложении под винду qInstallMsgHandler возвращает 0 - баг или фича - не знаю.


Название: Re: Задарили Android-планшет, закомпилил прогу на Qt 5.2, запустил. А как дебажить?
Отправлено: xintrea от Январь 06, 2014, 00:31
Я просто устанавливаю точки останова и нажимаю начать отладку. Программа запускается на андроиде и я могу выполнять ее пошагово.
Кстати, все отладочные сообщения передаются и выводятся в окне QtCreator.

Ну у меня пробные программки тоже дебажатся.

А вот именно мой проект - не дебажится. Я сравниваю основные опции сборки в *.pro файле, никакого криминала не вижу.

Ссылка на проект: https://github.com/xintrea/mytetra_dev

Если есть возможность, попробуй у себя запустить. Не забудь только на ветку experimental переключиться перед сборкой.

Я уже просто не знаю в какую сторону копать. Программа на Андроиде сегфолтится после первого окна (на десктопах все ок), а я даже отдебажиться не могу.


Название: Re: Задарили Android-планшет, закомпилил прогу на Qt 5.2, запустил. А как дебажить?
Отправлено: Old от Январь 06, 2014, 11:42
Программа на Андроиде сегфолтится после первого окна (на десктопах все ок), а я даже отдебажиться не могу.
А у меня все работает. :)
По крайней мере основное окно открывается, меню вызывается и по quit завершается.
Если просто запускать или с отладкой - все ок. При запуске с отладкой получаю весь отладочный вывод.

Да, проект собираю под armeabi-v7a.
android-ndk r9c
android-sdk r22.3


Название: Re: Задарили Android-планшет, закомпилил прогу на Qt 5.2, запустил. А как дебажить?
Отправлено: xintrea от Январь 06, 2014, 12:02
А у меня все работает. :)
По крайней мере основное окно открывается, меню вызывается и по quit завершается.
Если просто запускать или с отладкой - все ок. При запуске с отладкой получаю весь отладочный вывод.

Я разобрался в чем проблема (как минимум, у меня): http://www.linux.org.ru/forum/development/10016743?cid=10017655


Цитировать
Проблема оказалась в том, что отладка под Андроид не может работать в случае, если в файле проекта *.pro вручную указан каталог сборки через опции OBJECTS_DIR и MOC_DIR и каталог результата через DESTDIR.

Сборка в режиме Android Kit правильно распознает OBJECTS_DIR и MOC_DIR, и складывает туда moc-и и объектники. Сборка правильно распознает DESTDIR и складывает туда конечный бинарник.

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

Решение проблемы: для сборки под Андроид в QtCreator 3.0.0 не использовать опции DESTDIR, OBJECTS_DIR, MOC_DIR, (и UI_DIR, я формами не пользуюсь, поэтому не проверял). То есть, не прописывать эти опции в *.pro файле. QtCreator сам установит в Android Kit эти опции по своему разумению. Тогда отладка будет работать.


Совершенно не понимаю, почему у тебя работает, ты же использовал мой mytetra.pro при сборке, и отлаживался в QtCreator 3.0.0.

Но дальше я продвинуться не могу, дело до основного экрана не доходит, у меня сегфолт на строке:

Код:
902: if(QApplication::clipboard()->mimeData()->hasFormat("mytetra/records"))

Это какой-то буллщит. Статический метод, тут никаких проблем с памятью быть просто не может.

Пробовал в разных эмуляторах - в результате сегфолт на этой строке.



На реальном устройстве отладка не работает, при попытке отладки имею сообщение:

http://i.piccy.info/i9/d008faca0fa4dfda443fd4c5680ae9a8/1388998747/58688/597435/scr_317.png

Девелопмент-меню в настройках активировано, отладка по USB включена. Может на девайсе еще что-то где-то надо включить? Рутовать девайс обязательно?



Название: Re: Задарили Android-планшет, закомпилил прогу на Qt 5.2, запустил. А как дебажить?
Отправлено: lit-uriy от Январь 06, 2014, 12:02
xintrea, чёйта http://webhamster.ru не доступен (504 Gateway Time-out).

П.С.
Хотел инструкцию почитать


Название: Re: Задарили Android-планшет, закомпилил прогу на Qt 5.2, запустил. А как дебажить?
Отправлено: Old от Январь 06, 2014, 12:05
Совершенно не понимаю, почему у тебя работает, ты же использовал мой mytetra.pro при сборке, и отлаживался в QtCreator 3.0.0.
Да, я ничего не менял.

Пробовал в разных эмуляторах - в результате сегфолт на этой строке.
Я запускал на реальной железке.

Девелопмент-меню в настройках активировано, отладка по USB включена. Может на девайсе еще что-то где-то надо включить? Рутовать девайс обязательно?
Я только разрешал отладку, девайс не рутован.


Название: Re: Задарили Android-планшет, закомпилил прогу на Qt 5.2, запустил. А как дебажить?
Отправлено: xintrea от Январь 06, 2014, 12:22
xintrea, чёйта http://webhamster.ru не доступен (504 Gateway Time-out).

П.С.
Хотел инструкцию почитать

Заработал.


Название: Re: Задарили Android-планшет, закомпилил прогу на Qt 5.2, запустил. А как дебажить?
Отправлено: Old от Январь 06, 2014, 12:26
А в эмуле у меня тоже падает.  ::)


Название: Re: Задарили Android-планшет, закомпилил прогу на Qt 5.2, запустил. А как дебажить?
Отправлено: xintrea от Январь 06, 2014, 12:31
Да, проект собираю под armeabi-v7a.
android-ndk r9c
android-sdk r22.3

Спасиб за картинку. Хоть у кого-то моя прога работает (только не у меня, факин щит).

Давай по порядку.

1. Проект у меня собирается тоже в armeabi-v7a
2. У меня тоже android-ndk r9c
3. А как ты определяешь версию android-sdk? У меня только дата его известна - 20131030.


Название: Re: Задарили Android-планшет, закомпилил прогу на Qt 5.2, запустил. А как дебажить?
Отправлено: xintrea от Январь 06, 2014, 12:34
А в эмуле у меня тоже падает.  ::)

На той же строке?


Название: Re: Задарили Android-планшет, закомпилил прогу на Qt 5.2, запустил. А как дебажить?
Отправлено: Old от Январь 06, 2014, 12:35
3. А как ты определяешь версию android-sdk? У меня только дата его известна - 20131030.
Запусти на десктопе программу android из sdk и выбери about, или в таблице всех установленных компонентов поле Rev.


Название: Re: Задарили Android-планшет, закомпилил прогу на Qt 5.2, запустил. А как дебажить?
Отправлено: xintrea от Январь 06, 2014, 12:44
3. А как ты определяешь версию android-sdk? У меня только дата его известна - 20131030.
Запусти на десктопе программу android из sdk и выбери about, или в таблице всех установленных компонентов поле Rev.

Да андроид SDK тоже версии 22.3.

Теперь осталось понять, почему у тебя на девайсе работает, а в эмуле нет.

Вопрос - на какой строчке у тебя сегфолтится в эмуле.


Название: Re: Задарили Android-планшет, закомпилил прогу на Qt 5.2, запустил. А как дебажить?
Отправлено: Old от Январь 06, 2014, 12:48
Вопрос - на какой строчке у тебя сегфолтится в эмуле.
Стек возвратов:
Цитировать
0   ??         0x497890d0   
1   QtAndroidClipboard::hasClipboardText()   /home/bre/Qt5.2.0/5.2.0/android_armv7/plugins/platforms/android/libqtforandroid.so      0x496d8c52   
2   ??         0x2a183990   
3   ??         0x2a183990   


Название: Re: Задарили Android-планшет, закомпилил прогу на Qt 5.2, запустил. А как дебажить?
Отправлено: xintrea от Январь 06, 2014, 12:56
Стек возвратов:
Цитировать
0   ??         0x497890d0   
1   QtAndroidClipboard::hasClipboardText()   /home/bre/Qt5.2.0/5.2.0/android_armv7/plugins/platforms/android/libqtforandroid.so      0x496d8c52   
2   ??         0x2a183990   
3   ??         0x2a183990   

Судя по состоянию стека, у тебя таки не работает отладка. Я правильно понимаю?


Название: Re: Задарили Android-планшет, закомпилил прогу на Qt 5.2, запустил. А как дебажить?
Отправлено: Old от Январь 06, 2014, 13:02
Судя по состоянию стека, у тебя таки не работает отладка. Я правильно понимаю?
Да, на виртуальном устройстве не работает.  ???
Позже посмотрю еще, сейчас ребенок на моей машине смотрит мультики... :)


Название: Re: Задарили Android-планшет, закомпилил прогу на Qt 5.2, запустил. А как дебажить?
Отправлено: xintrea от Январь 06, 2014, 13:36
Ок.

В общем, как соберешся, из *.pro удаляй  DESTDIR, OBJECTS_DIR, MOC_DIR, UI_DIR. Удаляй .json в каталоге сборки или вообще полностью каталог вида

build-mytetra-Android_for_armeabi_v7a_GCC_4_8_Qt_5_2_0-Debug

удаляй.

Открывай в QtCreator заново, применяй дефолтный настройки и дебаг должен заработать.

Да, и еще файл mytetra.pro.user не забудь удалить.


Название: Re: Задарили Android-планшет, закомпилил прогу на Qt 5.2, запустил. А как дебажить?
Отправлено: xintrea от Январь 06, 2014, 14:29
Да, на виртуальном устройстве не работает.  ???

Я сделал минимальный проект, в нем тоже QApplication::clipboard() сегфолтится.

Проект MyTetra тут вообще не при чем.

Я создаю новую тему.

По топику проблема решена - как дебажить нам уже известно.