Программирование DSP Отладчики Blackfin Tue, November 20 2018  

Поделиться

нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Отладчики Blackfin Печать
Добавил(а) microsin   

Для инструментария разработки GNU (GNU toolchain) есть только один стандартный отладчик - gdb. Обучение и понимание работы с gdb не только поможет в отладке исходного кода ядра, драйверов, библиотек и приложений, но также повысит Вашу производительность. Хотя графические оболочки наподобие DDD, insight и eclipse упрощают интерфейс к gdb, понимание gdb на уровне командной строки также поможет лучше пользоваться графическими инструментами [2].

gdb входит в состав Blackfin, и его можно найти на сайте Blackfin Linux. Кликните на закладку Files, чтобы получить последнюю версию релиза gdb. Для установки gdb (для Ethernet или serial), поскольку для него нет отдельного пакета, просмотрите [3, 4] - там найдете указания для сборки инструментария из исходного кода или использования в установке готового скомпилированного rpm для Вашей системы. Если Вам нужен gdb для jtag, то это следует устанавливать отдельно.

Код, который нужно отлаживать, бывает двух основных типов:

• Приложения (отладка осуществляется с помощью gdb).
• Драйверы или ядро (используется kgdb или ICE).

[Отладка отдельных приложений]

Чтобы отладить Вашу программу, дистрибутив uClinux должен быть собран специальным образом:

1. Добавьте программу gdbserver, а также приложение, которое хотите отлаживать. gdbserver находится в окне Application Configuration (оно появляется после выбора Customize Vendor/User Settings) в категории Miscellaneous Applications. Это обычно установлено по умолчанию в конфигурациях Analog Devices (соответствующий элемент может быть помечен как "old", и текст подсказки говорит "mk68k targets only", однако этот элемент рабочий).

2. Создайте uImage.

3. Поместите этот образ памяти в целевую систему и выполните загрузку ядра и дистрибутива.

4. Скомпилируйте приложение для отладки с флагом "-g". Это добавит отладочную информацию, с которой может работать GDB. Также для улучшения отладки установите нулевой уровень оптимизации "-O0".

5. Загрузите символы в GDB из следующих источников:

- если пользовательское приложение (user-app) собрано в двоичный код FLAT (bfin-uclinux-gcc), то используйте файл user-app.gdb.
- если пользовательское приложение собрано в двоичный код fdpic ELF (bfin-linux-uclibc-gcc), то используйте user-app напрямую.

6. Поскольку gdbserver может обмениваться данными с компьютером хоста через соединение serial или Ethernet, Вы должны сами выбрать, какой канал связи использовать.

[Отладка через Serial Port]

Здесь показывается, как удаленно отлаживать программы uClinux через последовательный порт.

1. На целевой системе введите следующую команду на консоли uClinux:

uClinux> gdbserver /dev/ttyS1 отлаживаемая_программа

Подразумевается, что Вы подключились к gdb через устройство ttyS1 целевой системы.

2. На компьютере хоста (Linux) введите следующую команду:

bash$ bfin-uclinux-gdb -b 57600 отлаживаемая_программа.gdb

Или если Вы используете fdpic:

bash$ bfin-linux-uclibc-gdb -b 57600 отлаживаемая_программа

Ключ -b задает скорость, с которой программа будет использовать последовательный порт (в этом примере настроена стандартная скорость 57600 бод). Вы также можете выполнить команду set remotebaud 57600 в командной строке gdb, если забыли применить ключ -b. Если Вы отлаживаете flat-файл, то *.gdb для программы генерируется, когда программа компилируется. Если Вы используете fdpic, то файл будет типа unstripped executable. Его можно найти в каталоге программы (для дополнительной информации см. [5]). Если программа успешно скомпилирована, но файл *.gdb отсутствует, то убедитесь, что gcc был вызван с ключом -g. Это должно быть по умолчанию, если использовалась процедура, описанная в [5].

Подсказка: когда gdb запущен на хосте Linux, введите следующую команду в приглашении gdb, чтобы подключиться к целевой системе: gdb) target remote /dev/ttyS0 (подразумевается, что осуществляется подключение к gdbserver через устройство ttyS0 на хосте Linux).

3. Теперь Вы должны быть подключены к целевой системе. Чтобы начать отлаживать программу с точкой останова в начале функции main, введите следующие команды в приглашении gdb:

gdb) break main
gdb) continue

Вы должны использовать команду continue вместо команды run, потому что программа уже работает на удаленной системе.

Подсказка: в командной строке (приглашении) отладчика gdb на хосте Linux Вы можете теперь вводить любую стандартную команду gdb.

[Отладка через Ethernet]

Здесь показывается, как удаленно отлаживать программы uClinux через сетевое соединение.

1. Если целевой системе еще не назначен IP-адрес, то это должно быть сделано командой наподобие следующей:

uClinux> ifconfig eth0 IP_адрес

или:

uClinux> dhcpcd &

После того, как IP-адрес назначен, проверьте соединение на хосте Linux с помощью утилиты ping.

2. Запустите gdbserver на целевой системе следующей командой:

uClinux> gdbserver localhost:3456 отлаживаемая_программа

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

3. На хосте Linux выполните следующую команду:

bash$ bfin-uclinux-gdb отлаживаемая_программа.gdb

или:

bash$ bfin-linux-uclibc-gdb отлаживаемая_программа

Файл *.gdb отлаживаемой программы генерируется в момент её компиляции. Если Вы отлаживаете flat-файл, то файл *.gdb программы также генерируется при её компиляции. Если Вы используете fdpic, то файл будет типа unstripped executable, его можно найти в каталоге программы (для дополнительной информации см. [5]). Если программа успешно скомпилирована, но файл *.gdb отсутствует, то убедитесь, что gcc был вызван с ключом -g. Это должно быть по умолчанию, если использовалась процедура, описанная в [5].

Подсказка: когда gdb запущен на хосте Linux, для подключения к целевой системе введите в приглашении gdb команду: gdb) target remote IP_адрес_целевой_системы:3456 (номер порта здесь должен быть такой же, какой был указан на шаге 2 при запуске gdbserver).

4. Теперь Вы должны быть подключены к целевой системе. Чтобы начать отлаживать программу с точкой останова в начале функции main, введите следующие команды в приглашении gdb:

gdb) break main
gdb) continue

Вы должны использовать команду continue вместо команды run, потому что программа уже работает на удаленной системе.

Подсказка: в командной строке (приглашении) отладчика gdb на хосте Linux Вы можете теперь вводить любую стандартную команду gdb.

[Отладка динамических объектных библиотек]

Отладка debug dynamic object library с помощью GDB осуществляется почти так же, как и отладка приложения. Есть только несколько отличий:

1. Пользовательская object-библиотека libusertest.so должна компилироваться с флагом"-shared -mfdpic -g -ldl".

2. Пользовательское приложение usertest должно компилироваться с флагом "-mfdpic -g".

3. Библиотеки libdl.so и libusertest.so должны быть предварительно скопированы в папку lib корня образа файловой системы. Пользовательское приложение usertest должно быть скопировано в необходимое место того же образа.

4. Запуск GDB на хосте с приложением пользователя:

/> bfin-uclinux-gdb usertest

Не забудьте установить переменную окружения GDB solib-search-path на папки библиотеки, где можно найти libdl.so и libusertest.so.

(gdb) set solib-search-path /library-directory/

В случае, когда осуществляется поиск библиотек по нескольким путям (для надежности нужно установить solib-absolute-prefix для некоторого не существующего каталога, так как GDB использует только solib-search-path):

(gdb) set solib-absolute-prefix /non_exist_dir
(gdb) set solib-search-path /home/test/toolchain/bfin-linux-uclibc/bfin-linux-uclibc/runtime/lib:
/home/test/kernel/uclinux-dist/staging/usr/lib
(gdb) info sharedlibrary 
From        To          Syms Read   Shared Object Library
0x00248c78  0x00269b34  Yes         /home/test/kernel/uclinux-dist/staging/usr/lib/libeXosip2.so.4
0x00c88310  0x00c8834c  Yes         /home/test/toolchain/bfin-linux-uclibc/bfin-linux-uclibc/runtime/
lib/libresolv.so.0
0x02628490  0x02682ae4  Yes         /home/test/kernel/uclinux-dist/staging/usr/lib/libasound.so.2

Запустите приложение на целевой плате и подключите к ней gdb.

[Отладка Kernel]

Отладка ядра осуществляется так же, как и приложения. Утилиты хоста те же самые, и устанавливаются точно так же. Однако выбирайте отладку на уровне ядра (kernel level debugging) через ethernet/UART (с помощью KGDB) или JTAG (с помощью gdbproxy).

Отладка с помощью KGDB. В релизе 2008R1.5 или более старом перед запуском отладки Вам нужно проапгрейдить ядро патчем KGDB [6].

В релизе 2009R1+ отладчик kgdb в ядре уже поддерживается, так что не требуется дополнительный патч [7].

Отладка через JTAG (gdbproxy). Обычно большинство разработчиков удовлетворяет отладка с помощью gdb через подключение Ethernet или serial, как было описано ранее, однако при определенных обстоятельствах (отладка некоторых драйверов ядра, или отладка загрузчиков) требуется низкоуровневая отладка. Тогда требуется поддержка отладки через JTAG, см. [8].

[Часто используемые команды gdb]

break функция или имяфайла:номерстроки# - команда установит breakpoint на указанную функцию или номер строки кода (например break main, break myprog.c:7).

continue - команда продолжит выполнение программы с места, где она была остановлена последний раз.

delete breakpoint# или watchpoint# - команда удалит точку останова (breakpoint) или точку отслеживания состояния памяти (watchpoint), указанную по номеру. Здесь указывается номер watchpoint / breakpoint, который был задан при первой установке этих watchpoint / breakpoint.

disable breakpoint# - команда запрещает работу breakpoint по указанному номеру. Здесь указывается номер breakpoint, который был задан при её первой установке.

run - команда запускает отлаживаемую программу. При отладке программы на удаленной целевой системе используйте continue вместо run.

set variable symbol = value - команда установит переменную, указанную в symbol на заданное значение (value). Например  set variable x = 3.

step - команда выполняет следующую строку файла исходного кода.

watch symbol - команда устанавливает watchpoint на переменную, которую указывает символ symbol. Всякий раз, когда эта переменная изменяется, gdb оповестит Вас о старом и новом значении переменной (например, чтобы отслеживать значение переменной X введите команду watch X).

info registers - делает дамп регистров процессора.

x/4 0x839f80 - делает дамп памяти с адреса 0x839f80.

Отладчик gdb предоставляет намного больше функций, чем можно здесь описать, подробнее см. документацию gdb [9]. Также есть несколько продвинутых скриптов gdb, значительно экономящих время, которые можно использовать вместе с kgdb и gdb [10].

[Отладчики с графическим интерфейсом]

Insight. Insight [13] это графический интерфейс пользователя для GDB, GNU Debugger написан на TCL/Tk разработчиками, которые работают на Red Hat, Inc. и Cygnus Solutions. Insight скомбинирован вместе с GDB, и собран вместе с GDB.

Начиная с 2007R2 toolchain, Insight был интегрирован в обычную сборку тулчейна. Использование bfin-elf-insight, или bfin-linux-uclibc-insight, или bfin-uclinux-insight запустит Insight.

DDD. Data Display Debugger (ddd) это графический фронт-энд для отладчиков командной строки, таких как bfin-uclinux-gdb. Для большинства дистрибутивов Linux можно установить ddd через менеджер пакетов хоста (host package manager); альтернативно исходный код ddd [11] доступен для самостоятельной компиляции. Полное руководство по ddd можно найти в формате html или pdf. Проблема с DDD в том, что его разработка практически не активна. Однако DDD находится в таком состоянии, что им вполне можно пользоваться, и он особенно подходит для тех, кто мало знаком с командами GDB.

После того, как ddd установлен, Вы должны убедиться, что будет использоваться корректная программа gdb. Для удаленной отладки программ uClinux должна использоваться программа Blackfin bfin-uclinux-gdb, как описано ранее. Для удаленной отладки ядра должна использоваться программа Blackfin bfin-elf-gdb. Для использования ddd с любым из этих вариантов запускайте ddd с опцией -debugger:

ddd –debugger bfin-uclinux-gdb

Внешний вид главного окна ddd показан ниже во врезке. Здесь также можно увидеть пример начала типовой сессии отладки.

Главное окно с модулем исходного кода:

DDD source text window

Консоль GDB. Показана командная строка ddd для использования файла и удаленной целевой системы при подключении к целевой плате. В консоли можно вводить любые команды gdb:

DDD GDB console

Кнопки запускают некоторые общие команды ddd и gdb:

DDD command buttons

Поле аргумента. Это текстовое поле устанавливает аргумент (), который передается командам, запускаемым кнопками. В этом примере клик на кнопку команды точки останова очистит breakpoint на myprog.c:5 (модуль myprog.c, строка 5), в соответствии со значением, введенным в поле аргумента. В это поле записывается текущая строка или выбранный текст в окне исходного кода. В это поле Вы также можете напрямую ввести нужное значение с клавиатуры.

DDD argument field

Eclipse. Eclipse это отличный IDE-фреймворк. Он поддерживает несколько плагинов, и сообщество eclipse постоянно растет. В статье [12] описывается, как настроить Eclipse для отладки на Blackfin uClinux. Поскольку Eclipse написан на Java, для операционной системы хоста потребуется больше памяти. Eclipse общается с GDB через Machine Interface, в то время как DDD использует командный интерфейс. Machine Interface считается более стабильным.

GNAT Programming Studio (GPS). Это бесплатная, свободная IDE [14]. Имеет интуитивно понятный интерфейс, простая в использовании, обеспечивает легкую навигацию по исходному коду. В сравнении с DDD интерфейс отладки у GPS выглядит современнее.

GPS запускается так же, как и DDD:

ddd –debugger bfin-uclinux-gdb

[Ссылки]

1. Debuggers site:blackfin.uclinux.org.
2. Application Debugging site:blackfin.uclinux.org.
3. Installing the Blackfin Toolchain in Windows site:blackfin.uclinux.org.
4. Installing the Blackfin Toolchain in Linux site:blackfin.uclinux.org.
5. Adding User Applications site:blackfin.uclinux.org.
6. Debugging the Kernel with KGDB site:blackfin.uclinux.org.
7. KGDB: Kernel GDB site:blackfin.uclinux.org.
8. Gdbproxy site:blackfin.uclinux.org.
9. GDB: The GNU Project Debugger site:gnu.org.
10. GDB Debug Snippets site:blackfin.uclinux.org.
11. What is DDD? site:gnu.org.
12. Отладка uClinux на Eclipse.
13. Insight site:sourceware.org.
14. GNAT Integrated Development Environment site:libre2.adacore.com.

 

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


Защитный код
Обновить

Top of Page