Avr gdb как пользоваться windows

Записки программиста

Памятка по отладке при помощи GDB

Ранее в заметке Основы использования отладчика WinDbg мы узнали, как можно отлаживать приложения под Windows. Теперь настало время познакомиться с отладчиком gdb, который позволяет делать все то же самое под Linux и другими *nix системами. Благодаря этой заметке вы узнаете, как при помощи gdb ставить брейкпоинты и смотреть значения локальных переменных, анализировать coredump’ы и вот это все.

Для комфортной отладки сначала нужно собрать программу с правильными флагами. Во-первых, необходимо указать флаг -g . Иначе программа будет собрана без отладочных символов и отлаживать ее придется в ассемблерном коде (что, впрочем, вполне выполнимо для программ, написанных на чистом Си). Во-вторых, рекомендуется отключить оптимизации при помощи флага -O0 , иначе некоторые переменные окажутся, что называется, optimized out, и вы не сможете посмотреть их значения при отладке.

Другими словами, при прочих равных программу лучше собирать как-то так:

Запускаем программу в отладчике:

При необходимости передать программе какие-то аргументы можно так:

Запуск с так называемом Text User Interface, интерфейсом на основе curses (мне лично он не нравится):

Еще можно прицепиться к уже работающему процессу по его id:

Для анализа корок используем команду вроде такой:

Чтобы корки вообще писались, систему нужно правильно настроить:

Плюс в /etc/security/limits.conf пишем что-то вроде:

… а в /etc/sysctl.conf:

Кстати, корки можно создавать «вручную» прямо из gdb при помощи команды:

Для удаленной отладки на сервере выполняем команды:

На клиенте говорим откуда брать отладочные символы:

Заметьте, что в Ubuntu при попытке прицепиться к своим процессам без sudo вы можете получить ошибку вроде такой:

Could not attach to process. If your uid matches the uid of the target
process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or
try again as the root user.

For more details, see /etc/sysctl.d/10-ptrace.conf

ptrace: Operation not permitted.

Для решения этой проблемы говорим:

… а также правим /etc/sysctl.d/10-ptrace.conf:

Итак, тем или иным образом мы прицепились отладчиком куда надо. Теперь нам доступны следующие команды.

Для выполнения команды в gdb можно вводить либо всю команду целиком, либо только первые несколько букв. То есть, h , he и help или r , ru и run — это все одни и те же команды. Здесь я преимущественно буду использовать короткие версии, так как это то, что вы скорее всего будете использовать на практике. К тому же, соответствующие длинные версии обычно очевидны.

Начать выполнение программы, если она еще не выполняется:

Продолжить выполнение программы:

Прервать выполнение в любой момент можно нажатием Ctr+C.

Отцепиться от программы, оставшись при этом в отладчике:

Выйти из отладчика (если цеплялись через -p , процесс продолжит работу):

Просмотр исходного кода программы:

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

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

Step — шаг вперед или несколько шагов вперед:

Next — как step, только без захода внутрь других методов и процедур:

Until — выполнить программу до указанной строчки:

Продолжить выполнение до возвращения из текущей процедуры:

Перемещение между фреймами стака:

Информация о текущем фрейме:

Показать аргументы в текущем фрейме:

Показать локальные переменные в текущем фрейме:

Avr gdb как пользоваться windows


Отладчик — инструмент номер один в инженерном анализе

Обычно, чем больше размер программы, тем чаще приходится пользоваться отладчиком. В AVR Studio встроен замечательный эмулятор микроконтроллеров, на котором можно проверить работоспособность прошивки, и можно порадоваться за Windows пользователей, но что делать пользователям Linux?

В Linux в качестве эмулятора может выступить SimulAVR, а отладчиком avr-gdb. Собственно, работе с этим отладчиком и посвящен этот пост, потому-что им же производится отладка по JTAG. Но, пока я JTAG не разжился, придется пользоваться эмулятором. SimulAVR поддерживает небольшой набор микроконтроллеров и к том уже не всю периферию он эмулирует, но таймеры и порты преимущественно работают.

Supported devices: at90can128 at90can32 at90can64 at90s4433 at90s8515 atmega128 atmega1284 atmega1284a atmega16 atmega164 atmega164a atmega168 atmega32 atmega324 atmega324a atmega328 atmega48 atmega644 atmega644a atmega8 atmega88 attiny2313 attiny25 attiny45 attiny85

К сожалению XMega не поддерживается 😉 поэтому тренироваться будем на ATmega8. Для работы с отладчиком нужно будет скомпилировать прошивку с опцией -ggdb и убрать оптимизацию кода опцией -O0.

SimulAVR и AVR-GDB работают по клиент-серверной архитектуре. Первый выступает в роли сервера, второй в роли клиента.

Для отладки возьмем такой пример:

Прошивка весит более 2Кбайт, то что надо.

Читайте также:  Создание установочной флэш windows

Сейчас нужно запустить simularvr в режиме сервера:

Затем запустить отладчик avr-gdb:

подключиться им к simulavr серверу:

и загрузить на сервер прошивку:

Теперь можно поставить точно останова — breakpoint. Из всех брейков, мой самый любимый: break main. Можно иметь сколь угодно запутанную программу, состоящую их десятков исходников, но когда брейк на main, всегда попадаешь в начало кода:

После чего следует запустить программу на исполнение. Для этого вместо run, в avr-gdb служит команда continue:

Ok, программа запустилась и остановилась на breakpoint. Мы внутри работающей программы. Для начала можно осмотреться. Командой list можно распечатать листинг исходной программы:

а командой disass посмотреть ассемблерный код: посмотреть ассемблерный код

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

Команда info registers печатает содержимое регистров:

где первая колонка — наименование регистра, вторая колонка — шестнадцатеричное значение, третья — десятичное значение. Не обязательно каждый раз распечатывать все регистры, часто бывает достаточно знать значение одного:

к регистрам ввода-ввыода(РВВ), так обращаться не получится. Технически, РВВ это обычная ячейка памяти, обращаться к ней надо по адресу. DDRB в ATmega8 имеет адрес 0x17, PORTB — 0x18 что бы вывести их значение потребуется команда печати дампа оперативки x/xb:

теперь «перепрыгнем» на вложенный цикл for, это 26-я строка исходника:

информацию по точкам останова можно посмотреть командой info breakpoint:

точки останова можно удалять, отключать, снова включать:

распечатать значение переменной можно командой print, ее акронимом p, или той же x/xb:

Пошаговое выполнение осуществляется командами next(акроним n) — без захода в подпрограммы, или step (акроним s) — с заходом в подпрограммы:

изменить значение переменной из отладчика можно командой set:

одной из самых распространенных ошибок на Си, является выход за границу массива. На этапе компиляции такие ошибки не отлавливаются, часто такая такая обшивка «всплывает» при крайних значениях, границах массиво. Попробуем сымитировать такую ситуацию:

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

Работа с Flash памятью в AVR

С азами, разобрались, теперь попробуем с помощью отладчика разобраться в таком непростом вопросе как работа с Flash памятью. AVR позволяет хранить там различные константы и массивы. Flash память доступна только для чтения.

Немного погуглив по теме я выяснил, что чтобы скопировать массив из Flash памяти в ram, я должен получить адрес массива в flash и затем, с помощью макроса pgm_read_byte считать его в свой буффер.

В результате была написана такая пробная программа:

здесь массив mydata записаный во флеш-памяти копируется в буффер в оперативке, содержимое которого выводится через UART. Однако, стоит залесть отладчиком внутрь программы, то обнаруживается такая картинка:

т.е. ничего даже близко похожего на содержимое исходного массива в буфере нет, а указатель указывает на 0x100. Однако если дизассемблировать прошивку:

где красным выделен исходный массив. И начинается на с адреса 0х26.

Тогда пробуем изменть указатель ptr с 0x100 на 0x26 и считать исходный массив еще раз:

ну, так граздо лучше. Методом «нучного тыка» было обнаружено, что в программе нужно строку:

На этот раз все Ok

скачать архив с последним примером: скачать

Разработка роботов

AVR megaEclipse. Делаем среду all-in-one.

Мне всегда было интересно и даже немного завидно, почему системные программисты и те, кто разрабатывает настольные приложения обладают удобными средами, встроенным отладчиком, могут анализировать написанный код на предмет утечек памяти, производительности кода и так далее и почему этого всего почти нет для 8 и 16-битных микроконтроллеров? А ведь эти рабочие лошадки для большинства проектов выгодны по цене и целесообразны по производительности и функционалу. Проект среды разработки Eclipse призван стереть границы применимости среды и позиционирует некий универсал, не хватающие возможности которого можно дополнить плагинами и запуском внешних приложений. О том, как сделать эту среду отладчиком, средством прошивки микроконтроллеров, симулятором контроллера и средством контроля версий мы и расскажем в этой статье. Все это будет сделано по отношению к МК AVR, как самому любимому и популярному МК в рунете в связке с компилятором GCC.
В инете много вопросов о том, как настроить отладчик в этой среде, как сделать прошивку контроллера одним щелчком и как сделать систему сборки CMake под Eclipse. И если последнее мы обсуждали в нашей статье, то первое — очень актуально. Лично я после проведенных действий чувствую себя «белым человеком», так работа с МК свелась к нажатию кнопок, что очень удобно. Итак, поехали:

Для начала ставим компилятор winAVR. Зачем такое старье? Ведь уже есть AVR Toolchain. Узнаешь потом. Кстати, проясним ситуацию. Проект winAVR стал коммерческим. Его купила Atmel и платит разработчикам. Естественно после такого happy продолжения продукт становится хуже. Ведь те студенты, которые делали его за бургеры, начинают нормально работать, а это опасно!

Читайте также:  Что такое операционная система windows mobile

Затем ставим AVR-Eclipse plugin. Как ставить, уже рассказано было тут.

Затем ставим обновление GDB Hardware Debugging. Для этого. Заходим Help—>Instal New Software и тыкаем, как показано на картинке (за одно можно и GCC Cross Compiler Support установить):

Отладчик. Прежде проведем небольшой ликбез. Отладка МК AVR выглядит следующим образом:

— Есть такая программулина — avarice.exe. Она лежит в каталоге компилятора. Эта программа выполняет своего рода буфер — преобразует команды GDB отладчика в команды JTAG отладчика. Образно говоря, «плюет» ему через hardware порт соответствующие команды и параметры. Эта программа также ждет данные на специальном порте, который является входным для нее и на который посылает данные сам отладчик верхнего уровня.

— В роли отладчика верхнего уровня выступает avr-gdb, он устанавливает socket-соединение с портом, с которого ждет данные avarice.

— Собственно ваша среда, где команды «шаг вперед», брейкпоинт преобразуются и посылаются avr-gdb.

В Avr Studio 4 схема была похожей, но они скомпилировали свой avarice и сделали его зависимым от пары DLL файлов. Это, к примеру, позволяет работать старым отладчикам типа Jtag ICE MKI с новыми контроллерами Avr Mega2560, только работать НЕПРАВИЛЬНО. Не используйте старый отладчик для МК megaAVR от 1280 и выше. Прошивка и отладка идут неверно в этом случае. Зачем Atmel это сделала — непонятно. На самом деле, много чего непонятно в этой компании. Компания теряет рынок и в принципе, уже практически обречена на утрату позиций.

Чем шить? Avrdude. конечно. А как лучше сделать вызов этого консольного приложения, также будет рассказано в этой статье, причем 3мя различными вариантами. Теперь к делу:

1. Настраиваем проект, выбираем формат генерируемых данных после сборки как avr-gdb отладчика в свойстве проекта.

2. Настройка avarice.

Заходим в настройку внешних инструментов

1. Задаем имя

2. Не стоит быть наивным, что у вас в Path прописан путь к этой тулзе. Находим ее руками в папке компилятора и явно указываем.

3. Говорим, что путь к рабочей директории проекта хранится в его системной переменной worspace_loc. Спешу сообщить, что адрес папки туда заносится при создании проекта. А вот большинство остальных системных переменных в Eclipse не инициализированы, хотя и доступны на использование. Только если вы их укажете, то тут же появится ошибка нулевой переменной. Почему разработчики так сделали, неясно.

4. Пишем параметры запуска. Здесь на картинке приведен пример для программатора-отладчика AVR Dragon. Например для JTAG ICE MKI будет так:

-1 —ignore -intr —jtag /dev/comX:4242, где X — номер порта

Сохраняем, проверяем — делаем RUN. Убеждаемся, что avarice запустился. Он закроется с ошибкой, если порт недоступен или программатора там нет. (Кстати, сравните это с картинкой, увидите разницу. Картинка взята с официальной документации на Eclipse).

2. Симулятор simulavr.exe. У нас есть незабываемая возможность отладить код частично на своем компьютере. Что может быть полезно, если код, который вы пишете — имеет сложную логику. То есть работает с периферией по минимуму. Вот только есть одно НО! Поддерживается всего лишь 4 контроллера:

Здесь все аналогично первому описанию.

Вообще, открою секрет, я ранее пытался все это настроить, руководствуясь вот этим ресурсом. Вроде официальная документация от Eclipse. Ну так вот, там в примере вам серьезно предлагают указать тут atmega16, которого нет в поддержке. Ну, в общем, косяк и он там не единственный. В дальнейшем, simulavr будет для вас как бы заменой avarice, то есть вместо запуска avarice, нужно будет запустить эту тулзу. Двигаемся дальше.

3. AVR-GDB

Существует 2 способа отладки, они указаны красным на следующей картинке. Мы настроим оба.

Разница между ними практически отсутствует. Работать физически они будут с одной и той же тулзой.

C/C++ Local Application

Debugger

Установить в gdbserver Debugger

GDB debugger

Изменить на «avr-gdb«.

GDB command file

GDB command set

Выбрать «Standard (Windows)».

Protocol

Verbose console mode

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

Далее переходим на вкладку Connection.

Тип соединения — TCP

GDB Hardware Debugging

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

Далее переходим на вкладку, изображенную на следующей картинке:

Здесь выбираем, где расположен .elf файл, необходимый для отладки. Опять-таки, используйте только эту системную переменную, либо пишите путь абсолютно. В принципе, можно указать так: $\debug\$.elf . Тогда получим универсальную настройку, но придется для проектов прописать соответствующие переменные.

Ставим галочки «поставить брейкпоинт» на «main» и продолжить. В случае, если вам нужно при этом залить прошивку (что может быть удобно), поставьте галочку на «load symbols» и укажите путь к прошивке .hex , также можно отлаживать не сначала и задать значение счетчику команд. На этом всё.

Читайте также:  Драйвер для canon mf4400 series ufrii lt для windows 10

Запуск отладчика

Итак, последовательность действий всегда будет такова:

1. Запускаем avarice или simualvr. Для этого на вкладке «External tools application» выбираем настроенный нами профиль и запускаем. В дальнейшем, это можно делать просто нажатием на кнопку. Запустится последний активный профиль.

2. Затем, запускаем отладчик. Для этого щелкаем кнопку с значком «bug», либо также выбираем один из двух профилей отладку и щелкаем запустить. Убедитесь, что avarice перед этим запустился, иначе среда выдаст вам сообщение, что невозможно создать процесс.

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


В чем прелесть такой кучи действий и настроек:
— в AVR Studio 5 убрали поддержку JTAG ICE MKI, тут она есть.
— даже из старой AVR Studio попробуйте отлаживать С++ код, собственно и проект на С++ собрать туда будет сложно. Здесь вы с помощью копеечного отладчика, который можно сделать самому, можете отлаживать С++ код.

Прошивка контроллера AVR через программатор, отладчик или даже Bootloader.

Способ 1.

Значит так. Мы юзаем отладчик JTAG ICE MKI, программатор AVr910, а также бутлодер STK500V2. А еще раньше юзали AVR Dragon, но он сгорел. Для всех эти случаев основа одинакова — создаем новую конфигурацию External Tools. Делаем это так, как показано на картинке:

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

avrdude –p m2560 -b 57600 –c stk500v2 –P com6 -v –U «flash:w:c:\uniRobot.hex:i»

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

При правильном выполнении команды в консоли вы получите следующую информацию:

avrdude: AVR device initialized and ready to accept instructions

Преимущества:

— STK500V2 -новый бутлодер и поддерживает новые контроллеры мега 2560 и старше

— высокая скорость. Даже большие прошивки шьются секунды.

— в отличие от AVRProg, встроенной в AVR Studio и имеющей GUI, здесь можно поменять скорость работы, что критично для МК с кварцем на 8 МГц, так как при таком кварце STK500V2 на 115200 работать не может.

Недостатки:

— Нужно перезагружать плату, чтобы она вошла в режим бутлодера

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

Для JTAG ICE MKI все аналогично, только нужно поменять STK500V2 на программатор jtag1 , в случае AVR910 — поставить avr910. BaudRate при этом ставить не нужно.

Способ 2. Подходит для тех, кто с помощью CMake создал сборку для проекта и собрал ее под Eclipse.

Здесь нужно рассказать про target. По сути, все внешние вызовы для сборки проекта делаются посредством запуска соответствующего target в системе сборки. Мы же можем добавить свой отдельный для прошивки, а затем создать его вызов в среде Eclipse, что она с удовольствием позволяет делать. Для этого вам придется отредактировать макрос cMake:

Затем, создаем вызов target, который в нашем случае выглядит как «имя проекта-upload».

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

Способ 3. Задействуем возможности AVR Eclipse plug-in. Только перед этим выберем в свойствах проекта соответствующий программатор «Проект->Свойства->AVR->AVRDude»

Доступно очень много программаторов. В списке можно найти практически все известные для AVR. Также можно изменить параметры запуска:

В общем, на этом радость заканчивается, теперь о печальном:

Пичалька

Вы собрали проект с помощью CMake, импортировали его в среду. Вас ожидают отличные новости, у Eclipse всех версий, кроме последней нет средства преобразования проекта с добавлением тегов, чтобы уже установленные плагины могли работать с «чужим проектом». В любом случае, после добавления проекта, сгенерированного CMake, вам нужно сделать конвертацию проекта. Для этого выберет file->new-convert to C/C++ и дождитесь, пока среда изменить файлы проекта. Это позволит вам отлаживать проект и способом 2 сделать прошивку. В новой версии Индиго добавили-таки новую форму конвертации, когда среда добавляет в XML файл проекта специальный тег Nature, однако даже это не делает проект доступным для AVR-eclipse плагина. Я еще в старой версии обнаружил, что если добавить этот тег вручную, то инструменты плагина становятся доступны проекту, теперь же этот конвертер добавили, однако проблему он решил.

Заключение

Описанный выше способ позволяет превратить среду Eclipse в интегрированную среду разработки. Все операции можно будет производить, используя только GUI.

Оцените статью