Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:0
Поисковых ботовПоисковых ботов:2
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:3
Форум » starterkit.ru » Отладочные платы » SK-MAT91SAM9G45/M10
пошаговая отладка приложения на плате
buletz
Добавлено 05.01.2012 16:07
0
Сообщение: 1
buletz
3

Пункты: 5920
Регистрация: 16.11.2011
Пол: Мужчина
Предыстория
На данный момент добился успешной компиляции C/C++ проекта на базе Eclipse IDE и запуска получаемого бинарника (.elf) на плате. Но при этом все что я могу - это откомпилить проект на хосте, скопировать по TFTP на плату (target) и запустить. Никакой отладки пока нет, но дальше без нее - никак.

Поэтому возникла задача:
иметь пошаговую отладку своего приложения на плате.

Как я понял, для этого можно использовать ethernet (TCP/IP) соединение между хостом и платой. В качестве софта который осуществляет отладку используется gdb: gdbserver на плате (target) и gdb на хосте.
На хосте вроде бы все настроил, об этом отписался в соседней ветке:
http://starterkit.ru/html/index.php?name=forum&op=view&id=7832&num=2#14739

ВНИМАНИЕ, ВОПРОС:

Как запустить gdbserver на плате?
Если просто тупо скопировать, то он не запускается, выдает ошибку:
Код
./gdbserver error while loading shared libraries: libthread_db.so.1

Копирование указанной библиотеки в папку с gdbserver не помогает, все равно та же ошибка.

Правильно я понимаю, что надо gdbserver включить в состав файловой системы buildroot?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 05.01.2012 19:00 Редактировалось 05.01.2012 19:28 Сообщение: 2
sasamy
4.70

Пункты: 77230
Регистрация: 14.08.2009
Смотрите например в google по ключевой фразе "eclipse linux remote debugging ssh"

Цитата

Копирование указанной библиотеки в папку с gdbserver не помогает, все равно та же ошибка.


Скопируйте в /lib на целевой платформе или еще лучше все библиотеки туда вручную скопируйте, например у CS они тут
Path_to_CodeSourcery/Sourcery_G++_Lite/arm-none-linux-gnueabi/libc/lib

потому что при утановке в buildroot они все проходят через srtip который удаляет всю отладочную информацию.
Спуститься к концу Подняться к началу
Персональная информация
buletz
Добавлено 05.01.2012 23:00 Редактировалось 05.01.2012 23:00 Сообщение: 3
buletz
3

Пункты: 5920
Регистрация: 16.11.2011
Пол: Мужчина
спасибо за помощь. продвинулся:

1. gdbserver на target-е запустился успешно.
При старте отладки gdbserver выдает "Remote debugging from host ..."
т.е. обмен идет нормально.
Но при этом в Eclipse при старте отладки выдает no source available for "0x0".

2. В настройках Debug configurations в Eclipse
поменял имя gdb клиента:
было: gdb
стало: arm-none-linux-gnueabi-gdb
http://img85.imageshack.us/img85/2509/screenshotnis.png

В результате теперь при запуске отладки имею:
No source available for "0x400b5890"

Это уже ближе к правде. Теперь видимо надо ткнуть эклипс носом в исходники, почему-то он их не видит.
Спуститься к концу Подняться к началу
Персональная информация
buletz
Добавлено 07.01.2012 01:56 Сообщение: 4
buletz
3

Пункты: 5920
Регистрация: 16.11.2011
Пол: Мужчина
продвинулся дальше:

1. спасибо sasamy за правильные ключевые слова гугла, нашел очень наглядную статейку с инструкциями, как настроить eclipse в линуксе для remote debugging:
http://embedded-linux.co.uk/tutorial/eclipse-rse

2. согласно указанной инструкции полностью заработал RSE (Remote System Explorer), благодаря которому отладка полностью автоматизируется:
- не нужно вручную копировать бинарник на target, Eclipse делает это автоматически;
- автоматом запускается gdbserver;
- ну и как бонус возможность копировать файлы с host на target и обратно через интерфейс эклипса.

2.1. чтобы наладить RSE пришлось сделать следующее:
- установить sftp-server на target (включаем dropbear и openssh в buildroot-е)
- создать пользователя и дать ему права (chmod 666) для /dev/null, иначе sftp не работает. можно и под рутом работать с sftp, но для этого надо установить руту пароль (с пустым паролем не работает) и вообще под рутом вроде как не рекомендуют.

3. Теперь по CTRL+F11 (Run) программа успешно стартует, выполняется и результат выполнения видно в консоли эклипса, что удобно т.к. не нужно переключаться на консоль target-а и смотреть туда.

4. Однако отладка (по F11, Debug) пока что не завелась.

ПРОБЛЕМА
Вот что имею:
http://img4.imageshack.us/img4/8836/screenshotdebughello2ma.png

В окне Debug вижу:
Код
Thread [1] 1396 (Suspended : Signal : SIGILL:Illegal instruction)
main() at main.c:10 0x8e6a

и соответственно по нажатию Resume или Step over отладка вылетает с надписью
Код

Child terminated with signal = 0x4 (SIGILL)
GDBserver exiting


Если кликнуть на gdb то видно ошибки и предупреждения, см. ниже.

ВОПРОС:
Связано ли то что gdb выдает ошибки о несоответствии библиотек с тем, что у меня сама отладка вылетает с SIGILL:Illegal instruction?


ошибки gdb:
Код
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
Cannot access memory at address 0x0
warning: `/usr/lib/libstdc++.so.6': Shared library architecture unknown is not compatible with target architecture arm.
warning: .dynamic section for "/usr/lib/libstdc++.so.6" is not at the expected address (wrong library or version mismatch?)
warning: `/lib/libm.so.6': Shared library architecture unknown is not compatible with target architecture arm.
warning: .dynamic section for "/lib/libm.so.6" is not at the expected address (wrong library or version mismatch?)
warning: `/lib/libgcc_s.so.1': Shared library architecture unknown is not compatible with target architecture arm.
warning: .dynamic section for "/lib/libgcc_s.so.1" is not at the expected address (wrong library or version mismatch?)
warning: `/lib/libc.so.6': Shared library architecture unknown is not compatible with target architecture arm.
warning: .dynamic section for "/lib/libc.so.6" is not at the expected address (wrong library or version mismatch?)
warning: Could not load shared library symbols for /lib/ld-linux.so.3.
Do you need "set solib-search-path" or "set sysroot"?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 07.01.2012 14:52 Сообщение: 5
sasamy
4.70

Пункты: 77230
Регистрация: 14.08.2009
Решил посмотреть на этот еклипс - вопрос, зачем вы ставите плагин
Цитата

- GNUARM plugin для eclipse установлен


он же не поддерживает линуксовые кросскомпиляторы ? т.е. потом все равно нужно вручную править префикс.
Спуститься к концу Подняться к началу
Персональная информация
buletz
Добавлено 07.01.2012 17:37 Редактировалось 07.01.2012 17:37 Сообщение: 6
buletz
3

Пункты: 5920
Регистрация: 16.11.2011
Пол: Мужчина
1. почему это не поддерживает?
тут написано
http://sourceforge.net/projects/gnuarmeclipse/
Код
Description
This plug-in is an Eclipse CDT Manged Build Extension for GNU ARM Toolchains like CodeSourcery G++ Lite, GNUARM, WinARM, Yagarto, devkitPro.

т.е. поддерживает CodeSourcery который как раз таки линуховый кросс-компилятор.

2. Другой вопрос зачем вообще ставить этот плагин - я честно говоря уже не помню, что именно он дает, но в какой-то доке вычитывал набор который надо ставить и туда входил этот GNU ARM.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 07.01.2012 19:25 Редактировалось 07.01.2012 21:15 Сообщение: 7
sasamy
4.70

Пункты: 77230
Регистрация: 14.08.2009
Цитата

1. почему это не поддерживает?
тут написано


Дык что значит поддерживает, если приходится опять же делать это:

Цитата

изменить строку Compiler invocation command c
"arm-none-eabi-gcc" на "arm-none-linux-gnueabi-gcc" (без кавычек).

и тд во всех местах :)

это можно и без плагина сделать и так же точно работать будет. В общем я скачал этот
http://www.eclipse.org/downloads/packages/eclipse-ide-cc-linux-developers-includes-incubating-components/indigosr1

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

# ls -l /root
total 20
-rw------- 1 root root 20390 Jan 1 03:00 cross


Причем тоже самое с другой версией совершенно (которая в убунте штатная).
Цитата

Error during file upload.
Operation failed. File system input or output error
Operation failed. File system input or output error
Operation failed. File system input or output error

Интересно что сам ssh на плате прекрасно работает - я недавно как раз с Qt Creator подобные эксперименты проводил и там все ок..
Спуститься к концу Подняться к началу
Персональная информация
buletz
Добавлено 08.01.2012 14:36 Редактировалось 08.01.2012 14:39 Сообщение: 8
buletz
3

Пункты: 5920
Регистрация: 16.11.2011
Пол: Мужчина
1. По поводу "Error during file upload.":
иногда (очень редко) наблюдал у себя такие же сообщения. лечилось так:
- переходим в RSE;
- делаем коннект (коннектится ОК);
- делаем дисконнект.
После этого запускаем отладку через RSE - ошибка пропадает.

2. Избавился от warning-ов gdb.
Для этого:
a)
в debug configurations прописываем пути к либам компилятора
/arm-2007q1/arm-none-linux-gnueabi/lib
/arm-2007q1/arm-none-linux-gnueabi/libc/lib
как на скриншоте:
http://img843.imageshack.us/img843/5850/screenshotdebugconfigur.png

b) создаем в папке эклипс проекта файл .gdbinit и прописываем там:
set sysroot <здесь_ваш_путь>/arm-2007q1/arm-none-linux-gnueabi/

В итоге варнинги пропадают, но отладка все равно не идет.
Теперь имеем другой Suspended:
Код
Thread [1] 1551 (Suspended : Container)
main() at main.c:10 0x8eda

http://img189.imageshack.us/img189/8836/screenshotdebughello2ma.png

Если жмем Resume то получаем те же коды ошибки
Код
Child terminated with signal = 4
Child terminated with signal = 0x4 (SIGILL)
GDBserver exiting


Не растёт кокос что-то...
Спуститься к концу Подняться к началу
Персональная информация
buletz
Добавлено 08.01.2012 15:36 Сообщение: 9
buletz
3

Пункты: 5920
Регистрация: 16.11.2011
Пол: Мужчина
Короче источник бед локализован - это breakpoint-ы.
Если убрать галочку на "Stop on startup at: main" в Debug configurations и убрать все брейкпоинты то отладка идет нормально, на паузу реагирует нормально и доступен просмотр всех текущих переменных.

Как только появляется хотя бы один брейкпоинт, то после него при продолжении отладки (resume, stop over или др.) - все отваливается.

Так что надо разбираться с брейкпоинтами.
Спуститься к концу Подняться к началу
Персональная информация
buletz
Добавлено 11.01.2012 02:37 Редактировалось 11.01.2012 02:54 Сообщение: 10
buletz
3

Пункты: 5920
Регистрация: 16.11.2011
Пол: Мужчина
По-прежнему не удалось победить Breakpointы.

Собрал систему на ядре 3.1.5, buildroot 2012.0110 (snapshot).
Результат тот же - при появлении любого брейкпоинта отладка отваливается. Без брейкпоинтов все работает норм.

Сегодня коллективный мозг сгенерил такую идею для обхода этой проблемы.
===============================================

Делаем макрос:
Код

#define BREAKPOINT { if (breakpoint) { \
printf ("breakpointed!\n"); \
while (breakpoint) ; breakpoint=1; } }

Объявляем глобальную переменную

Код
int breakpoint=1;

Теперь в любом месте программы где нас интересует отладка вставляем BREAKPOINT.
Когда в консоли видим надпись breakpointed, то неспешно нажимаем паузу и вуаля - мы в отладке в нужном месте.
Чтобы продолжить выполнение изменяем значение переменной breakpoint на 0 и жмем F8 (Resume). Прога продолжает работать и отладка не отваливается.
Выглядит это так:
http://img600.imageshack.us/img600/272/screenshot11d.png

НЕДОСТАТОК:
1. вместо нормальных брейкпоинтов мы правим код, вставляя строчки с зацикливанием. соответственно находу вставить какой либо брейкпоинт нельзя.
2. по-прежнему нам недоступно выполнение по шагам типа Step into, Step over.

Короче костыль, но тем не менее это работает.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Отладочные платы » SK-MAT91SAM9G45/M10