Windows gdb: GDB: The GNU Project Debugger

Содержание

Краткий гайд по использованию GDB / Хабр

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

GDB — переносимый отладчик проекта GNU, который работает на многих UNIX-подобных системах и умеет производить отладку многих языков программирования, включая Си, C++, Free Pascal, FreeBASIC, Ada, Фортран, Python3, Swift, NASM и Rust.


Почему именно GDB? Всё легко, он уже установлен на многих UNIX-подобных системах, лёгок в использовании и поддерживает много языков. Работа с ним оказывается очень лёгкой, а также его можно подключить к VSCode и другим редакторам кода (Включая Vim, NeoVim (ясное дело), Emacs, Atom и далее)


Подготовка файлов

Для примера мы возьмём файлы .cpp и будем проходиться по ним вдоль и поперёк.

Для того чтобы нам пройтись по такому файлу нам нужно скомпилировать его с помощью G++ с использованием флага -g (это действительно важно, без этого флага, программа не будет корректно работать в GDB).

g++ -g file_name.cpp -o output_name
gdb output_name

Python-файл вы можете продебажить с помощью этой команды:

gdb -ex r --args python program_name.py <arguments>

Для Java вы просто можете использовать jdb, который уже идёт в комплекте c JDK.

Также, если вам не хочется компилировать всё ручками, вы можете просто использовать сайт OnlineGDB, там просто нужно вставить код и нажать debug, а затем внизу откроется консоль, где вы сможете писать команды.


Использование GDB

Как только мы зашли в GDB нам выводится следующее сообщение:

GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from 3_Hero's_Inventory.cpp...done.

Последняя строка говорит о том, нормально ли запустился файл.

Теперь нужно посмотреть, где в нашем файле точка вхождения (строка, откуда наша программа начинает свою работу), в случае cpp это метод main(). Находим номер этой строки c помощью команды list и пишем её порядковый номер с буквой b (также можно просто указать имя функции b main тоже работает):

(gdb) list
1   #include <iostream>
2   #include <string>
3   
4   using namespace std;
5   
6   int main(int argc, char *argv[])
7   {
8       // Hero's Inventory - скрипт, где мы имитируем инвентарь игрока
9   
10      const int MAX_ITEMS = 10; // Задаём константу, максимум по инвентарю игрока
(gdb) b 6
Breakpoint 1 at 0xcb5: file ./3_Hero's_Inventory.cpp, line 6.

Далее запускаем программу с помощью комманды r:

(gdb) r
Starting program: /home/username77177/gitprojects/learning/cpp/build_folder/3_Hero's_Inventory.cpp 

Breakpoint 1, main (argc=1, argv=0x7fffffffdd18) at ./3_Hero's_Inventory.cpp:7
7   {

Также вы можете включить TUI, с помощью комбинации клавиш <Ctrl-x a>

Для того, чтобы посмотреть на какой мы сейчас строке, нужно написать f:

(gdb) f
#0  main (argc=1, argv=0x7fffffffdd18) at ./3_Hero's_Inventory.cpp:14
14      items[itemnum++] = "Sword";

Для того, чтобы сделать шаг, нужно нажать n (от слова next):

(gdb) n
10      const int MAX_ITEMS = 10; // Задаём константу, максимум по инвентарю игрока

Как мы видим GDB сразу пропускает пустые строки (или строки с комментариями) и переходит к следующей строке.
Предположим, что у нас есть функция, при нажатии n наш отладчик быстро пройдет функцию, не заходя в неё, чтобы зайти в функцию нужно сделать «шаг внутрь» (step-in) или просто клавиша s:

(gdb) s
11      string items[MAX_ITEMS]; // Создаём массив из строк c 10 элементами

(В примере нет функции, однако шаг step-in все равно будет работать и с обычными инициализациями, условиями и циклами)

Чтобы узнать какие переменные (локальные) сейчас инициализированны в программе нужно написать комманду info locals:

(gdb) info locals
MAX_ITEMS = 10
items = {"", "", "", "", "", "", "", "", "", ""}
itemnum = 0
game = 247

Чтобы вывести только одну переменную, нужно написать print имя_переменной:

(gdb) print MAX_ITEMS 
$1 = 10

Мы можем также изменить переменную с помощью set:

(gdb) set x = 77177
(gdb) print x
$1 = 77177

Мы можем также следить за переменными с помощью watch:

watch x

Также, если нужно можно посмотреть что в данный момент находится в регистрах (info registers):

(gdb) info registers 
rax            0x7fffffffdc00   140737488346112
rbx            0xffffffffffffffff   -1
rcx            0xa0 160
rdx            0x7fffffffdd28   140737488346408
rsi            0x7fffffffdd18   140737488346392
rdi            0x7fffffffdbf0   140737488346096
rbp            0x7fffffffdc30   0x7fffffffdc30
rsp            0x7fffffffdab0   0x7fffffffdab0
r8             0x7ffff782fd80   140737345944960
r9             0x0  0
r10            0x6  6
r11            0x7ffff7b77020   140737349382176
r12            0x7fffffffdc10   140737488346128
r13            0x7fffffffdd10   140737488346384
r14            0x0  0
r15            0x0  0
rip            0x555555554cfe   0x555555554cfe <main(int, char**)+100>
eflags         0x286    [ PF SF IF ]
cs             0x33 51
ss             0x2b 43
ds             0x0  0
es             0x0  0
fs             0x0  0
gs             0x0  0

Чтобы посмотреть какие в данный момент есть breakpoints (точки останова) нужно написать info breakpoints:

(gdb) info breakpoints 
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000555555554cb5 in main(int, char**) 
                                                   at ./3_Hero's_Inventory.cpp:6
    breakpoint already hit 1 time
2       breakpoint     keep y   0x0000555555554cfe in main(int, char**) 
                                                   at ./3_Hero's_Inventory.cpp:14

Чтобы удалить точку останова del breakpoint_num:

(gdb) info breakpoints 
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000555555554cb5 in main(int, char**) 
                                                   at ./3_Hero's_Inventory.cpp:6
    breakpoint already hit 1 time
2       breakpoint     keep y   0x0000555555554cfe in main(int, char**) 
                                                   at ./3_Hero's_Inventory.cpp:14

(gdb) del 1

(gdb) info breakpoints 
Num     Type           Disp Enb Address            What
2       breakpoint     keep y   0x0000555555554cfe in main(int, char**) 
                                                   at ./3_Hero's_Inventory.cpp:14

Чтобы прыгнуть к следующей точке останова нужно нажать c:

(gdb) r
Starting program: /home/username77177/gitprojects/learning/cpp/build_folder/3_Hero's_Inventory.cpp 

Breakpoint 3, main (argc=1, argv=0x7fffffffdd18) at ./3_Hero's_Inventory.cpp:7
7   {
(gdb) c
Continuing.

Breakpoint 2, main (argc=1, argv=0x7fffffffdd18) at ./3_Hero's_Inventory.cpp:14
14      items[itemnum++] = "Sword";

Мы можем вызывать функции из программы (локальные) с помощью call:

(gdb) call MyFunction()

Чтобы продолжить выполнение функции и остановить программу когда она (функция) завершится нужно написать

finish или fin:

(gdb) fin

Стоит уточнить, что нельзя использовать finish в главном методе.

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

(gdb) kill
Kill the program being debugged? (y or n) y

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

(gdb) help
List of classes of commands:

aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
internals -- Maintenance commands
obscure -- Obscure features
running -- Running the program
stack -- Examining the stack
status -- Status inquiries
support -- Support facilities
tracepoints -- Tracing of program execution without stopping the program
user-defined -- User-defined commands

Type "help" followed by a class name for a list of commands in that class.
Type "help all" for the list of all commands.
Type "help" followed by command name for full documentation.
Type "apropos word" to search for commands related to "word".
Command name abbreviations are allowed if unambiguous.

Установка отладчика GDB под Windows MinGWn и его использование вместе с Qt

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

Отладчик GDB является важным инструментом среды разработки приложений Qt. Без него Qt Creator, например, теряет большую часть своей функциональности (остается, разве что, подсветка синтаксиса в редакторе и контекстная справка). Вплоть до версии Qt Creator 2.4.1 отладчик GDB устанавливался вместе с Qt Creator, равно как и компилятор MinGW. Начиная с версии Qt Creator 2.5.0, отлачик GDB необходимо собирать самостоятельно. Данная статья призвана оказать помощь в решении этой проблемы. При ее подготовке использовался материал с ресурса Wiki от Nokia.

Есть хорошая новость! С недавних пор сборка GDB существенно упростилась. Похоже, что это заслуга еще Nokia. Предполагается, что MSYS уже установлен вместе с утилитами patch, unzip и файлом msys-bz2-1.dll. Последовательность установки этих утилит следующая:

3. По окончании установки вручную добавим пару полезных утилит, которые не вошли в состав ядра MSYS, но могут оказаться востребованными. Речь идет об утилитах patch и unzip, файлы которых можно найти здесь:

http://sourceforge.net/projects/mingw/files/MSYS/Extension/

нужны файлы:

patch-2.6.1-1-msys-1.0.13-bin.tar.lzma и
unzip-6.0-1-msys-1.0.13-bin.tar.lzma

Скачанные файлы распаковываем с помощью 7-Zip, и содеожимое папок bin из архивов помещаем в одноименную папку MSYS

C:\Qt\mingw-4.6\msys\1.0\bin

4. При сборке GDB потребуется еще одна библиотека. Скачиваем файл

http://sourceforge.net/projects/mingw/files/MSYS/Base/bzip2/bzip2-1.0.6-1/libbz2-1.0.6-1-msys-1.0.17-dll-1.tar.lzma/download

распаковываем его с помощью 7-Zip, и помещаем библиотечный файл msys-bz2-1.dll из папки bin архива в одноименную папку MSYS (см. выше).

5. В заключение необходимо прописать в системе путь к компилятору. В системную переменную Path дописываем через точку с запятой

C:\Qt\mingw-4.6\bin

Рассмотрим подробно порядок действий.

1. Скачиваем на сайте разработчика архив с исходниками Qt Creator

qt-creator-2.6.1-src.zip   26 MB
(версия, доступная на момент написания статьи)

2. Распаковываем архив в корень диска D:\. Переименовываем для удобства папку с исходником D:\qt-creator-2.6.1-src, например, в D:\s (аналогичное действие выполняется при сборке Qt Creator).

3. Открываем в текстовом редакторе файл D:\s\dist\gdb\Makefile.mingw, находим неработающую на сегодняшний день ссылку

http://download.qt.nokia.com/misc/gdb/7.4/build-prerequisits/python.zip

и исправляем ее на

http://get.qt.nokia.com/misc/gdb/7.4/build-prerequisits/python.zip

4. Запускаем MinGW Shell (см. группу ярлыков MinGW в меню Пуск или файл C:\Qt\mingw-4.6\msys\1.0\msys.bat) и вводим команды

cd /d/s/dist/gdb
make -f Makefile.mingw

5. Результатом сборки будет папка D:\s\dist\gdb\qtcreator-gdb-7.4.1, содержащая две цели i686-pc-mingw32 и arm-none-linux-gnueabi (нас интересует первая) и необходимый набор библиотечных файлов. Переместим эту папку в какое-нибудь удобное для нас место, например в C:\Qt. Теперь в настройках связки инструментов Qt Creator в качестве отладчика следует указывать файл

C:\Qt\qtcreator-gdb-7.4.1\gdb-i686-pc-mingw32.exe

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

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

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

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

gcc -O0 -g test.c -o test

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

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

gdb —args ./test —ololo —trololo

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

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

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

gdb /path/to/prog /tmp/core_prog.1234

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

ulimit -c unlimited
sudo sysctl -w kernel.core_pattern=’/tmp/core_%e.%p’

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

# где eax — имя вашего пользователя в системе
eax    soft core    50000
eax    hard core    500000

… а в /etc/sysctl.conf:

kernel.core_pattern = /tmp/core_%e.%p

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

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

sudo apt-get install gdbserver
gdbserver :3003 myprog

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

… и цепляемся:

target remote 10.110.0.10:3003

Заметьте, что в 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.

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

sudo sh -c ‘echo 0 > /proc/sys/kernel/yama/ptrace_scope’

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

kernel.yama.ptrace_scope = 0

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

Хэлп:

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

Fun fact! Нравится статья? Поддержи автора, чтобы он мог писать больше полезных статей!

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

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

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

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

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

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

l
l номер_строки
l откуда,докуда

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

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

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

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

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

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

Показать стэктрейс:

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

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

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

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

Ставим бряк:

b mysourcefile.c:123
b my_procedure_name

Список бряков:

Удаление бряка по номеру:

Удаление всех бряков:

Временное включение и выключение бряков:

Проигнорировать столько-то итераций:

Условные брейкпоинты ставятся как-то так:

b место if variable == 1

Еще вы можете установить брейкпоинт прямо в исходном коде вашей программы:

  /* … */
  do_something();
  /* одинаковый синтаксис для GCC и CLang */
  __asm__ __volatile__(«int3»);
  do_something_else();
  /* … */

Список нитей:

Переключение на нитку:

Вывести значение переменной:

Также можно кастовать типы:

Обращаться к полям:

p mystruct.field
p *mystryct.otherfield

Вообще можно использовать gdb как калькулятор:

p (10.0+20+30)/sizeof(int)

Можно менять значения переменных в программе:

Есть ограниченная поддержка переменных:

Можно вызывать процедуры и методы:

set $pi = (int*)malloc(sizeof(int))
p $pi
p free($pi)

Дамп памяти (explore):

x/16xb some_var
x/32uh some_var
x/64dw some_var

В приведенных примерах выводится дамп (1) 16-и байт с выводом в hex, (2) 32-х полуслов, которые выводятся, как числа без знака и (3) 64-х слов, которые выводятся, как числа со знаком.

Еще gdb умеет выполнять «скрипты», что позволяет, к примеру, быстро получить текущий стектрейс процесса и тут же отсоединиться, почти не останавливая его работу:

gdb —batch —command=gdb.script -p 12345

Описанных выше возможностей gdb вам хватит в 95% случаев. Но не следует думать, что ничего другого gdb не умеет! Мы не рассмотрели вачдоги, форматы вывода в стиле p/x, DDD, и многое другое. GDB User Manual занимает более 700 страниц, поэтому пересказать его в рамках небольшого поста никак не представляется возможным. Из мануала вы узнаете, как отлаживать процессы, использующие системный вызов fork(), а также многие другие интересные вещи!

А пользуетесь ли вы gdb, и если да, то что бы добавили к этой шпаргалке?

Дополнение: Также вас могут заинтересовать заметки Памятка по использованию отладчика LLDB и Reverse debugging кода на C/C++ с помощью GDB и RR. Больше об отладке ассемблерного кода с помощью GDB вы узнаете из поста Написание и отладка кода на ассемблере x86/x64 в Linux.

Метки: C/C++, Отладка.

Чем открыть GDB

GDB является распространенным форматом файлов баз данных (БД) InterBase. Разработан изначально компанией Borland.

Софт для работы с GDB

Рассмотрим программы, которые открывают искомое расширение.

Способ 1: IBExpert

IBExpert — это приложение с немецкими корнями, которое является одним из популярных решений для управления базами данных InterBase. Распространяется бесплатно в пределах СНГ. Обычно используется в связке с серверным программным обеспечением Firebird. При установке необходимо внимательно отнестись к тому, чтобы версия Firebird была строго 32-битной. Иначе работать IBExpert не будет.

Загрузить IBExpert с официального сайта

Загрузить Firebird с официального сайта

  1. Запускаем программу и кликаем на пункт «Зарегистрировать базу» в «База данных».
  2. Появляется окно, где необходимо ввести регистрационные данные нового сервера. В поле «Сервер/Протокол» выбираем тип «Local, default». Версию сервера выставляем «Firebird 2.5» (в нашем примере), а кодировку — «UNICODE_FSS». В полях «Пользователь» и «Пароль» вводим значения «sysdba» и «masterkey» соответственно. Для добавления БД щелкаем по значку папки в поле «Файл базы данных».
  3. После чего в «Проводнике» перемещаемся в каталог, где располагается необходимый файл. Потом выделяем его и кликаем «Открыть».
  4. Все остальные параметры оставляем по умолчанию и далее нажимаем «Регистрировать».
  5. Зарегистрированная БД появляется во вкладке «Database Explorer». Для открытия жмем правой кнопкой мышки по строке файла и указываем пункт «Подключиться к базе».
  6. База данных открывается, а ее структура отображается в «Database Explorer». Для ее просмотра надо кликнуть строку «Таблицы».

Способ 2: Embarcadero InterBase

Embarcadero InterBase представляет собой систему управления БД, в том числе и имеющих расширение GDB.

Загрузить Embarcadero InterBase с официального сайта

  1. Взаимодействие с пользователем осуществляется через графический интерфейс IBConsole. После ее открытия нужно запустить новый сервер, для чего жмем на «Add» в меню «Server».
  2. Появляется Мастер добавления нового сервера, в котором жмем «Next».
  3. В следующем окне оставляем все как есть и кликаем «Next».
  4. Далее нужно ввести имя пользователя и пароль. Можно воспользоваться кнопкой «Use Default», после чего щелкнуть «Next».
  5. Затем по желанию вводим описание сервера и завершаем процедуру нажатием кнопки «Finish».
  6. Локальный сервер отображается в списке серверов InterBase. Для добавления базы данных надо щелкнуть по строке «Database» и в появившемся меню выбрать «Add».
  7. Открывается «Add Database and Connect», в котором необходимо выбрать БД для открытия. Жмем кнопку с многоточием.
  8. В эксплорере отыскиваем GDB файл, выделяем его и кликаем «Открыть».
  9. Далее нажимаем «ОК».
  10. Открывается база данных и затем для отображения ее содержимого нужно нажать по строке «Tables».

Недостатком Embarcadero InterBase является отсутствие поддержки русского языка.

Способ 3: Recovery for Interbase

Recovery for Interbase – это софт для восстановления БД Interbase.

Загрузить Recovery for Interbase с официального сайта

  1. После запуска приложения жмем «Add files» для добавления GDB файла.
  2. В открывшемся окне «Проводника» переходим в каталог с исходным объектом, выделяем его и щелкаем «Открыть».
  3. Файл импортируется в программу, после чего жмем «Next».
  4. Далее появляется запись о необходимости сделать резервную копию базы данных, которую требуется восстановить. Нажимаем «Next».
  5. Осуществляем выбор каталога сохранения конечного результата. По умолчанию им является «Мои документы», однако при желании можно выбрать другую папку, нажав «Select a different folder».
  6. Происходит процесс восстановления, после окончания которого появляется окно с отчетом. Для выхода из программы жмем «Done».

Таким образом мы выяснили, что формат GDB открывается таким ПО, как IBExpert и Embarcadero InterBase. Преимуществом IBExpert является то, что он имеет интуитивно понятный интерфейс и предоставляется бесплатно. Еще одна программа Recovery for Interbase также взаимодействует с рассматриваемым форматом при необходимости его восстановления.

Мы рады, что смогли помочь Вам в решении проблемы.
Опишите, что у вас не получилось. Наши специалисты постараются ответить максимально быстро.
Помогла ли вам эта статья?
ДА НЕТ

Настраиваем бесплатную сборку для написания и отладки программ под микроконтроллеры на основе ядра ARM под Windows 10

Идея написать статью (которая войдет в цикл статей для новичков, остро жаждущих создавать что-то на микроконтроллерах при почти нулевых знаниях в области программирования в принципе) пришла мне после того, как мне пришлось немного отвлечься от своих основных дел, чтобы помочь другу настроить рабочую среду для написания софта под его небольшой домашний проект на основе board-а с stm32f103 на борту. Я рассчитывал, что это займет около получаса, максимум час, но ноутбук друга был на Windows 10 x64, что для меня уже непривычно (сам работаю в Ubuntu). По итогу мы потратили практически 8 часов на настройку и создание простого проекта, борясь с многими не очевидными вещами.

Параллельно с этим мне пришлось подробно объяснять, какой элемент сборки для чего нужен, а так же, как эти элементы взаимодействуют между собой, поскольку друг до этого никогда ранее с микроконтроллерами не сталкивался (от слова «видел Arduino в магазине»).

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

Оглавление

  1. Постановка задачи.
  2. Выбор программных средств реализации.
  3. Ставим Eclipse Neon 3.
    • Скачиваем установщик Eclipse.
    • Устанавливаем JRE.
    • Устанавливаем Eclipse.
    • Устанавливаем в Eclipse плагин GNU ARM Eclipse.
    • Патчим JRE (на случай появления ошибки при установке плагина).
    • Устанавливаем GNU ARM Eclipse Windows Build Tools.
  4. Скачиваем и устанавливаем GNU ARM Embedded Toolchain.
  5. Устанавливаем OpenOCD.
  6. Устанавливаем драйвера на st-link v2.
  7. Разбираемся, как все это работает.
  8. Заключение.

Постановка задачи

Требуется настроить связку таким образом, чтобы можно было:
  1. Скомпилировать проект, состоящий из C (C99), CPP (C++14) и ASM файлов.
  2. Собрать из скомпилированных файлов единый файл прошивки («.elf» и, при необходимости, «.hex», а так же «.map» файл для удобного анализа сборки).

Выбор программных средств реализации

Для решения поставленных задач нам потребуются следующие программные продукты:
  1. Eclipse Neon 3 для C/C++ (самая последняя версия на момент написания статьи). Будет использована нами как IDE (текстовый редактор с удобным авто дополнением + удобства по взаимодействию со средствами отладки), в которой мы будем писать код.
  2. JRE (на момент написания статьи, самая последняя версия 1.8.0). Без него не запустится установщик Eclipse (ну и сам Eclipse).
  3. GNU ARM Embedded Toolchain (на момент написания статьи, самой последней версией был 5_4-2016q3-20160926). Это комплекс нужных нам программных решений (таких как компилятор C кода «gcc», C++ кода «g++», линкер — «ld», средство загрузки и отладки финальной прошивки — «gdb» и многие другие), благодаря которым мы получим из наших файлов с исходным кодом файл с разрешением «.elf», представляющий из себя бинарный файл прошивки микроконтроллера, который в последствии будет загружен в микроконтроллер (об этом ниже).
  4. OpenOCD 0.10.0. С помощью него мы будем загружать наш «.elf» файл программы в микроконтроллер (на деле, OpenOCD предоставляет связь между gdb из указанного выше toolchain-а и отладчиком).
Помимо перечисленных средств, нам нужно будет поставить еще несколько небольших пакетов, о которых я скажу уже непосредственно в процессе установки.

Ставим Eclipse Neon 3

Как говорилось выше, для того, чтобы писать код, нам нужен текстовый редактор, в котором было бы удобно писать (различные методы авто-дополнения, поиска по проекту, навигация по файлам и т.д). А после того, как мы написали код, было бы неплохо, чтобы его компиляция, сборка и исполнение — были бы делом пары комбинаций клавиш (или кликов мышью, кому как удобно).
Для этих целей я использую Eclipse. Помимо редактора, он представляет еще возможность подключения различных расширений, которые значительно упрощают жизнь разработчика, сводя всю рутинную работу (сборку, компоновку, загрузку программы в контроллер) к паре кликов/нажатий.
Скачиваем установщик Eclipse
  1. Переходим на официальный сайт
  2. Справа вверху нажимаем download.
  3. В открывшейся окне слева выбираем download (x64/x32 должно подобраться автоматически).
  4. Ну и нажимаем download по центру, после чего начнется загрузка. При желании, можно про спонсировать создателей IDE…
Вот более наглядный процесс скачивания.
Устанавливаем JRE
Для того, чтобы запустить установщик, нужно сначала установить JRE. Последняя версия на момент написания статьи 1.8.0.
  1. Запускаем скаченный нами установщик. Получаем ошибку о том, что отсутствует JRE.
  2. Нажимаем «нет» и ждем перехода на сайт.
  3. На сайте выбираем пункт «Oracle JRE 1.8.0».
  4. Выбираем «Accept License Agreement».
  5. Скачиваем Offline версию, согласно разрядности вашей Windows.
  6. Запускаем скаченный файл. Дальнейшая установка проблем не вызывает.
Вот наглядный процесс скачивания и установки.
Устанавливаем Eclipse
  1. Запускаем скаченный нами установщик.
  2. Выбираем версию для C/C++.
  3. Указываем путь установки (я оставил по умолчанию, и вам советую).
  4. Принимаем соглашение.
  5. Ждем окончания установки.
  6. Нажимаем «LAUNCH», чтобы запустить среду.
  7. Указываем путь, который будет использовать Eclipse для ваших проектов по умолчанию (я оставил по умолчанию), а так же ставим галочку, чтобы данное окно больше не появлялось.
  8. Убеждаемся, что IDE запустилась, закрываем.
  9. Во время закрытия можем поставить галочку, чтобы окно предупреждения о закрытии более не появлялось.
Вот наглядный процесс установки.
Устанавливаем в Eclipse плагин GNU ARM Eclipse
Как говорилось ранее, Eclipse позволят подключать различные плагины, упрощающие жизнь разработчика. Одним из таких плагинов является GNU ARM Eclipse. Благодаря нему мы получим возможность легко соединить все используемые нами программные компоненты при создании нового проекта под наш контроллер (как это делать, будет описано ниже).
  1. Переходим на официальный сайт.
  2. В правом столбце, под строкой «Downloads» выбираем «Plug-ins».
  3. Далее под строкой «The GNU ARM Eclipse plug-ins update site URL is still on SourceForge:» копируем ссылку на плагин. На момент написания статьи это была: http://gnuarmeclipse.sourceforge.net/updates
  4. Открываем Eclipse.
  5. Переходим «Help» -> «Install New Software…».
  6. В открывшемся окне нажимаем на «Add…».
  7. В еще одном открывшимся окне в пункте «Name:» пишем, например, «ARM» (название не важно), а в строку «Location:» вставляем скопированную нами с сайта ссылку.
  8. Нажимаем «ОК»
  9. Окно закроется и в списке строк появится пустой чекбокс с надписью «Pending…».
    Далее в случае, если вы встретитесь с ошибкой, представленной ниже, то перейдите к пункту «Патчим JRE», а затем вернитесь и повторите всё с пункта 4.
    Unable to read repository at http://gnuarmeclipse.sourceforge.net/updates/content.xml.
    Unable to read repository at http://gnuarmeclipse.sourceforge.net/updates/content.xml.
    Received fatal alert: handshake_failure

    В случае, если ошибки не возникло или вы ее уже исправили, продолжаем дальше.
  10. После того, как появится строка «GNU ARM C/C++ Cross Development Tools», необходимо выбрать чекбокс слева от нее и нажать «Next».
  11. После еще раз «Next».
  12. Далее принимаем лицензионное соглашение и нажимаем «Finish». Начнется процесс установки.
  13. В процессе установки появится предупреждение о безопасности. Жмем «ОК».
  14. По окончании установки потребуется перезагрузить Eclipse, для этого нажимаем «Yes» в появившемся окне.
  15. На этом установка этого плагина завершена.
Процесс установки плагина в картинках
Патчим JRE (если в пункте выше произошла ошибка)
Так уж случилось, что в JRE есть неприятный баг, мешающий нам нормально установить плагин. Не вдаваясь в природу сея явления, делаем следующие действия.
  1. Переходим на сайт с патчем.
  2. Выбираем пункт «Accept License Agreement».
  3. Скачиваем «.zip» архив.
  4. Распаковываем. В архиве 2 файла («local_policy.jar» и «US_export_policy.jar») патча и текстовый файл. Копируем эти 2 файла с разрешением «.jar» и заменяем ими файлы по адресу установленной java. В случае 64-х битной windows 10, это путь
    C:\Program Files\Java\jre1.8.0_121\lib\security
    Путь может быть другим в случае, если выйдет новая версия jre или у вас ОС с другой разрядностью. Главное, что вы должны зайти в папку «\lib\security» и туда скопировать с заменой эти 2 файла. На этом патч можно считать завершенным. Можно снова запустить eclipse и установить плагин.
Фото ошибки и путь замены.
Устанавливаем GNU ARM Eclipse Windows Build Tools
Дело в том, что в windows по умолчанию команда «make» в командной строке не работает (хотя и в linux не во всех дистрибутивах данное приложение по умолчанию установлено). Для чего нам нужно приложение «make», мы поговорим ниже, а сейчас нам просто нужно поставить плагин, который добавит возможность пользоваться им. Для этого.
  1. Переходим в официальный репозиторий.
  2. Скачиваем «.exe» файл под свою платформу. На момент написания статьи самая актуальная версия «gnuarmeclipse-build-tools-win64-2.8-201611221915-setup.exe».
  3. Запускаем скаченный файл и просто жмем «Next», «A Agree», «Next», «Install», «Finish».

Скачиваем и устанавливаем GNU ARM Embedded Toolchain

  1. Переходим на официальный сайт
  2. Скачиваем последнюю актуальную версию, собранную в «.exe» файл для Windows (в столбце справа).
  3. Запускаем скаченный файл.
  4. Жмем «ОК».
  5. Затем «Далее»
  6. «Принимаю»
  7. «Установить» (вот тут поясню, что папку можно указать любую, но лучше все-таки оставить ту, что стоит по умолчанию, во избежание проблем с регистрацией компонентов во время установки).
  8. По окончании установки снимаем галочку с «Показать файл ReadMe.». Остальные оставляем по умолчанию.
  9. «Готово»

Следующие действия несут информативный характер и могут быть пропущены. В этом случае, открывшуюся командную строку можно закрыть.
  1. В открывшейся командной строке пишем «cd bin», без ковычек (именно тут лежат «.exe» файлы всех компонентов toolchain-а).
  2. Набираем «arm-none-eabi-gcc —version», без ковычек.
  3. Убедившись, что gcc ответил, закрываем консоль.
Процесс установки и проверки наглядно.

Устанавливаем OpenOCD

Со средой и toolchain-ом разобрались. Далее нужно установить OpenOCD, с помощью которого Eclipse через arm-none-eabi-gdb будет рулить контроллером. Тут все просто.
  1. Переходим в официальный репозиторий.
  2. Скачиваем «.exe» файл под свою ОС. На момент написания статьи, самая актуальная версия «gnuarmeclipse-openocd-win64-0.10.0-201701241841-setup.exe».
  3. Запускаем скаченный «.exe». Установку производим не меняя ничего (в том числе и путь).

Устанавливаем драйвера на st-link v2

OpenOCD управляет контроллером, это верно, но для этого ему требуется драйвер на отладчик. В нашем случае, это st-link v2. В случае, если у вас другой отладчик, то эту часть можно пропустить.
Вне зависимости от того, поддельный у вас st-link или оригинальный, драйвера одни и те же. Начнем.
  1. Переходим на официальную страницу st-link v2
  2. Внизу страницы скачиваем файл «STSW-LINK009» с описанием «ST-LINK, ST-LINK/V2, ST-LINK/V2-1 USB driver signed for Windows7, Windows8, Windows10».
  3. При переходе на другую страницу нажимаем «Download» в нижней части страницы. Тут важно заметить, что если вы сидите в интернете не через VPN, то вам придется зарегистрироваться. Как это делать, я описывать не буду. После чего файл будет скачен.
  4. Разархивировав архив выбираем файл установки драйвера согласно разрядности ОС. В моем случае, это «dpinst_amd64.exe».
  5. Во время установки соглашаемся со всеми требованиями. И выбираем чекбокс «Всегда доверять программному обеспечению STMicroelectronics».
Процесс скачивания и установки в картинках.

Разбираемся, как все это работает

Вот мы установили все необходимые компоненты, создали проект в Eclipse (о том, как создать и настроить проект, будет написано в следующей статье) и нажали «Ctrl+B». Получили готовый файл прошивки, который нажатием по иконке «отладка» можно загрузить в контроллер и начать непосредственно отладку. Но что скрывается за всеми этими действиями? А происходит следующее:
  1. После того, как вы нажимаете «Ctrl+B» — Eclipse анализирует дерево каталогов проекта (все созданные нами папки и файлы, находящиеся в них). Для этого он пользуется путями к файлам, которые мы укажем при создании проекта.
  2. После этого Eclipse создает makefile. Этот файл содержит в себе указания для программы make о том, какие файлы нужно компилировать (которые мы добавили в проект, указав при этом путь к каталогам, где они лежат), с какими параметрами (здесь Eclipse пользуется заполненными нами параметрами во вкладке «C/C++ Build») и как компоновать в итоговом файле прошивки скомпилированные ранее файлы.
    Заметка: makefile не имеет расширения.
  3. Далее Eclipse вызывает программу make с указанием пути к созданному makefile, а так же параметры сборки, указанные нами при настройке проекта (это, например количество потоков процессора, используемого для компиляции).
  4. Программа make проходит по всем файлам проекта, согласно указаниям в makefile-е и получает для каждого файла файл с расширением «.o». Эти файлы располагаются в папке Debug точно так же, как и в основном проекта (с сохранением иерархии дерева). Если в каком-то файле будет ошибка, вы получите уведомление об этом, выделенное красным в консоли компиляции (по умолчанию она располагается внизу экрана). При возникновении ошибки компиляции, дальнейшая компиляция и сборка прекращаются. Для компиляции файлов make использует указанный в makefile toolchain (вернее сказать, его компоненты: gcc/g++). Путь к toolchain-у Eclipse берет, опять же, из настроек проекта.
  5. После создания всех «.o» файлов из «.c», «.cpp», «.S» (прошу заметить, файлы с ассемблерным кодом обязательно должны иметь расширение большой буквы «S», иначе при создании makefile данные файлы будут просто проигнорированы, что ведет к трудно уловимым ошибкам) make вызывает компоновщик (arm-none-eabi-ld из установленного нами toolchain-а) с указанием путей к файлам компоновки из проекта (файлы с расширением «.ld», которые мы добавим в проект). Тут компоновщик, опираясь на указанные в файлах компоновки с расширением «.ld» указания (правила) пытается собрать из кучи «.o» файлов один объектный файл с разрешением «.elf» (и, если есть такие указания в makefile, «.hex» и «.map»). Важно заметить, именно linker (компоновщик) решает, какие куски кода и данных можно выкинуть из программы (если сочтет, что они нигде не используются и просто занимают место). Таким образом, если мы создадим 1000 глобальных переменных, из которых будем использовать в коде только 2, то остальные (если явно не задано, что их нельзя исключать из проекта ключевым словом «volatile» или указанием «положить в секцию, из которой ничего нельзя убирать») будут исключены из конечного объектного файла, что даст нам больше свободной памяти.
  6. После того, как мы получили конечный объектный файл, мы можем его «зашить» в контроллер и провести отладку. Для этого Eclipse вызывает программу OpenOCD с указанием пути к файлу «openocd.cfg» (имя может быть любое, с расширением «.cfg», но в случае, если вам придется когда-нибудь отлаживаться из командной строки, а не из под IDE, то вы ощутите, что правильно названный файл для OpenOCD позволяет вам не писать имя файла конфигурации (т.к. в случае, если файл конфигурации был не указан, то автоматически ищется файл с таким именем)).
    В случае, если указанный файл существует, OpenOCD, согласно параметрам в файле, попытается соединиться с микроконтроллером. В случае, если подключение верно, вы получим уведомление о том, что связь установлена, отладчик контроллера работает.
    Для того, чтобы связаться с контроллером, OpenOCD использует драйвер для st-link-а, установленный нами в начале.
  7. После того, как OpenOCD смог установить связь с контроллером, он открывает telnet соединение. Если не вдаваться в подробности, это нужно для того, чтобы arm-none-eabi-gdb мог успешно управлять контроллером.
  8. После того, как telnet соединение установлено, Eclipse запускает arm-none-eabi-gdb с указанием порта, к которому нужно подключиться (тот, что открыл OpenOCD).
  9. Далее Eclipse посылает в gdb команды инициализации (стереть flash, записать файл прошивки, установить точку остановки на main, и еще несколько нобязательных параметров).
  10. После этого в Eclipse мы видим указатель на первую строку кода в файле main и можем начать отладку.
Чисто технически, все проделанные тут операции можно делать каждый раз вручную, но, согласитесь, куда удобнее просто нажать на клавишу и наслаждаться запущенной отладкой.

Заключение

В этой статье я постарался подробно описать процесс конфигурации сборки под Windows. В случае, если у вас появятся вопросы — пишите в личку, постараюсь помочь и добавить в статью проблему + ее решение.
В следующей статье я расскажу, как настроить Eclipse под конкретный контроллер, собрать демонстрационный проект и настроить отладку.

Изучаем С используя GDB / Хабр

Перевод статьи Аллана О’Доннелла Learning C with GDB.

Исходя из особенностей таких высокоуровневых языков, как Ruby, Scheme или Haskell, изучение C может быть сложной задачей. В придачу к преодолению таких низкоуровневых особенностей C, как ручное управление памятью и указатели, вы еще должны обходиться без REPL. Как только Вы привыкнете к исследовательскому программированию в REPL, иметь дело с циклом написал-скомпилировал-запустил будет для Вас небольшим разочарованием.

Недавно мне пришло в голову, что я мог бы использовать GDB как псевдо-REPL для C. Я поэкспериментировал, используя GDB как инструмент для изучения языка, а не просто для отладки, и оказалось, что это очень весело.

Цель этого поста – показать Вам, что GDB является отличным инструментом для изучения С. Я познакомлю Вас с несколькими моими самыми любимыми командами из GDB, и продемонстрирую каким образом Вы можете использовать GDB, чтобы понять одну из сложных частей языка С: разницу между массивами и указателями.

Введение в GDB

Начнем с создания следующей небольшой программы на С – minimal.c:
int main()
{
    int i = 1337;
    return 0;
}

Обратите внимание, что программа не делает абсолютно ничего, и даже не имеет ни одной команды printf. Теперь окунемся в новый мир изучения С используя GBD.

Скомпилируем эту программу с флагом -g для генерирования отладочной информации, с которой будет работать GDB, и подкинем ему эту самую информацию:

$ gcc -g minimal.c -o minimal
$ gdb minimal

Теперь Вы должны молниеносно оказаться в командной строке GDB. Я обещал вам REPL, так получите:
(gdb) print 1 + 2
$1 = 3

Удивительно! print – это встроенная команда GDB, которая вычисляет результат С-ного выражения. Если Вы не знаете, что именно делает какая-то команда GDB, просто воспользуйтесь помощью – наберите help name-of-the-command в командной строке GDB.

Вот Вам более интересный пример:

(gbd) print (int) 2147483648
$2 = -2147483648

Я упущу разъяснение того, почему 2147483648 == -2147483648. Главная суть здесь в том, что даже арифметика может быть коварная в С, а GDB отлично понимает арифметику С.

Теперь давайте поставим точку останова в функции main и запустим программу:

(gdb) break main
(gdb) run

Программа остановилась на третьей строчке, как раз там, где инициализируется переменная i. Интересно то, что хотя переменная пока и не проинициализирована, но мы уже сейчас можем посмотреть ее значение, используя команду print:
(gdb) print i
$3 = 32767

В С значение локальной неинициализированной переменной не определено, поэтому полученный Вами результат может отличаться.

Мы можем выполнить текущую строку кода, воспользовавшись командой next:

(gdb) next
(gdb) print i
$4 = 1337

Исследуем память используя команду X

Переменные в С – это непрерывные блоки памяти. При этом блок каждой переменной характеризуется двумя числами:

1. Числовой адрес первого байта в блоке.
2. Размер блока в байтах. Этот размер определяется типом переменной.

Одна из отличительных особенностей языка С в том, что у Вас есть прямой доступ к блоку памяти переменной. Оператор & дает нам адрес переменной в памяти, а sizeof вычисляет размер, занимаемый переменной памяти.

Вы можете поиграть с обеими возможностями в GDB:

(gdb) print &i
$5 = (int *) 0x7fff5fbff584
(gdb) print sizeof(i)
$6 = 4

Говоря нормальным языком, это значит, что переменная i размещается по адресу 0x7fff5fbff5b4 и занимает в памяти 4 байта.

Я уже упоминал выше, что размер переменной в памяти зависит от ее типа, да и вообще говоря, оператор sizeof может оперировать и самими типами данных:

(gdb) print sizeof(int)
$7 = 4
(gdb) print sizeof(double)
$8 = 8

Это означает, что по меньшей мере на моей машине, переменные типа int занимают четыре байта, а типа double – восемь байт.

В GDB есть мощный инструмент для непосредственного исследования памяти – команда x. Эта команда проверяет память, начиная с определенного адреса. Также она имеет ряд команд форматирования, которые обеспечиваю точный контроль над количеством байт, которые Вы захотите проверить, и над тем, в каком виде Вы захотите вывести их на экран. В случае каких либо трудностей, наберите help x в командной строке GDB.

Как Вы уже знаете, оператор & вычисляет адрес переменной, а это значит, что можно передать команде x значение &i и тем самым получить возможность взглянуть на отдельные байты, скрывающиеся за переменной i:

(gdb) x/4xb &i
0x7fff5fbff584: 0x39    0x05    0x00    0x00

Флаги форматирования указывают на то, что я хочу получить четыре (4) значения, выведенные в шестнадцатеричном (hex) виде по одному байту (byte). Я указал проверку только четырех байт, потому что именно столько занимает в памяти переменная i. Вывод показывает побайтовое представление переменной в памяти.

Но с побайтовым выводом связана одна тонкость, которую нужно постоянно держать в голове – на машинах Intel байты хранятся в порядке “от младшего к старшему” (справа налево), в отличии от более привычной для человека записи, где младший байт должен был бы находиться в конце (слева направо).

Один из способов прояснить этот вопрос – это присвоить переменной i более интересное значение и опять проверить этот участок памяти:

(gdb) set var i = 0x12345678
(gdb) x/4xb &i
0x7fff5fbff584: 0x78    0x56    0x34    0x12

Исследуем память с командой ptype

Команда ptype возможно одна из моих самых любимых. Она показывает тип С-го выражения:
(gdb) ptype i
type = int
(gdb) ptype &i
type = int *
(gdb) ptype main
type = int (void)

Типы в С могут становиться сложными, но ptype позволяет исследовать их в интерактивном режиме.
Указатели и массивы

Массивы являются на удивление тонким понятием в С. Суть этого пункта в том, чтобы написать простенькую программу, а затем прогонять ее через GDB, пока массивы не обретут какой-то смысл.

Итак, нам нужен код программы с массивом array.c:

int main()
{
    int a[] = {1, 2, 3};
    return 0;
}

Скомпилируйте ее с флагом -g, запустите в GDB, и с помощь next перейдите в строку инициализации:
$ gcc -g arrays.c -o arrays
$ gdb arrays
(gdb) break main
(gdb) run
(gdb) next

На этом этапе Вы сможете вывести содержимое переменной и выяснить ее тип:
(gdb) print a
$1 = {1, 2, 3}
(gdb) ptype a
type = int [3]

Теперь, когда наша программа правильно настроена в GDB, первое, что стоит сделать – это использовать команду x для того, чтобы увидеть, как выглядит переменная a “под капотом”:
(gdb) x/12xb &a
0x7fff5fbff56c: 0x01  0x00  0x00  0x00  0x02  0x00  0x00  0x00
0x7fff5fbff574: 0x03  0x00  0x00  0x00

Это означает, что участок памяти для массива a начинается по адресу 0x7fff5fbff56c. Первые четыре байта содержат a[0], следующие четыре – a[1], и последние четыре хранят a[2]. Действительно, Вы можете проверить и убедится, что sizeof знает, что a занимает в памяти ровно двенадцать байт:
(gdb) print sizeof(a)
$2 = 12

До этого момента массивы выглядят такими, какими и должны быть. У них есть соответствующий массивам типы и они хранят все значения в смежных участках памяти. Однако, в определенных ситуациях, массивы ведут себя очень схоже с указателями! К примеру, мы можем применять арифметические операции к a:
(gdb) print a + 1
$3 = (int *) 0x7fff5fbff570

Нормальными словами, это означает, что a + 1 – это указатель на int, который имеет адрес 0x7fff5fbff570. К этому моменту Вы должны уже рефлекторно передавать указатели в команду x, итак посмотрим, что же получилось:
(gdb) x/4xb a + 1
0x7fff5fbff570: 0x02  0x00  0x00  0x00

Обратите внимание, что адрес 0x7fff5fbff570 ровно на четыре единицы больше, чем 0x7fff5fbff56c, то есть адрес первого байта массива a. Учитывая, что тип int занимает в памяти четыре байта, можно сделать вывод, что a + 1 указывает на a[1].

На самом деле, индексация массивов в С является синтаксическим сахаром для арифметики указателей: a[i] эквивалентно *(a + i). Вы можете проверить это в GDB:

(gdb) print a[0]
$4 = 1
(gdb) print *(a + 0)
$5 = 1
(gdb) print a[1]
$6 = 2
(gdb) print *(a + 1)
$7 = 2
(gdb) print a[2]
$8 = 3
(gdb) print *(a + 2)
$9 = 3

Итак, мы увидели, что в некоторых ситуациях a ведет себя как массив, а в некоторых – как указатель на свой первый элемент. Что же происходит?

Ответ состоит в следующем, когда имя массива используется в выражении в С, то оно “распадается (decay)” на указатель на первый элемент. Есть только два исключения из этого правила: когда имя массива передается в sizeof и когда имя массива используется с оператором взятия адреса &.

Тот факт, что имя a не распадается на указатель на первый элемент при использовании оператора &, порождает интересный вопрос: в чем же разница между указателем, на который распадается a и &a?

Численно они оба представляют один и тот же адрес:

(gdb) x/4xb a
0x7fff5fbff56c: 0x01  0x00  0x00  0x00
(gdb) x/4xb &a
0x7fff5fbff56c: 0x01  0x00  0x00  0x00

Тем не менее, типы их различны. Как мы уже видели, имя массива распадается на указатель на его первый элемент и значит должно иметь тип int *. Что же касается типа &a, то мы можем спросить об этом GDB:
(gdb) ptype &a
type = int (*)[3]

Говоря проще, &a – это указатель на массив из трех целых чисел. Это имеет смысл: a не распадается при передаче оператору & и a имеет тип int [3].

Вы можете проследить различие между указателем, на который распадается a и операцией &a на примере того, как они ведут себя по отношению к арифметике указателей:

(gdb) print a + 1
$10 = (int *) 0x7fff5fbff570
(gdb) print &a + 1
$11 = (int (*)[3]) 0x7fff5fbff578

Обратите внимание, что добавление 1 к a увеличивает адрес на четыре единицы, в то время, как прибавление 1 к &a добавляет к адресу двенадцать.

Указатель, на который на самом деле распадается a имеет вид &a[0]:

(gdb) print &a[0]
$11 = (int *) 0x7fff5fbff56c

Заключение

Надеюсь, я убедил Вас, что GDB – это изящная исследовательская среда для изучения С. Она позволяет выводить значение выражений с помощью команды print, побайтово исследовать память командой x и работать с типами с помощью команды ptype.

Если Вы планируете и далее экспериментировать с изучением С с помощью GDB, то у меня есть некоторые предложения:

1. Используйте GDB для работы над The Ksplice Pointer Challenge.
2. Разберитесь, как структуры хранятся в памяти. Как они соотносятся с массивами?
3. Используйте дизассемблерные команды GDB, чтобы лучше разобраться с программированием на ассемблере. Особенно весело исследовать, как работает стек вызова функции.
4. Зацените “TUI” режим GDB, который обеспечивает графическую ncurses надстройку над привычным GDB. На OS X, Вам вероятно придется собрать GDB из исходников.

От переводчика: Традиционно для указания ошибок воспользуйтесь ЛС. Буду рад конструктивной критике.

Как и чем открыть файл с расширением GDB

Расширение GDB – это формат файла базы данных, созданной в программе InterBase. Это программа с открытым исходным кодом (бесплатное программное обеспечение), в отличие от GnuPG и PGP. Это формат по умолчанию, который ранее использовался InterBase 6.5, а более поздние версии (начиная с 7.0) используют расширение IB.

Способы открытия файла с расширением GDB.

Для чего нужен файловый формат GDB

Расширение файла GDB обозначает, что здесь содержится какая-либо информация для навигаторов или спутников GPS. Это могут быть точки маршрута, сам маршрут или что-либо подобное. Такие компоненты необходимо для правильной работы большинства навигаторов или других устройств, использующих карты и технологию GPS.

Софт для работы с GDB

Чем открыть GDB-файлы? В интернете есть множество редакторов и интерактивных программ для разработчиков – в основном, это специализированное ПО для программистов. Ниже мы рассмотрим наиболее популярное программное обеспечение, которое позволит открыть файл gdb, – это IBExpert, Embarcadero InterBase и Recovery For Interbase.

IBExpert

IBExpert – очень полезный и функциональный инструмент для управления различными БД на компьютере. Программа полностью поддерживает SQL и имеет простой и в то же время понятный пользовательский интерфейс, который не вызовет никаких проблем при использовании. Дополнительным преимуществом программы является поддержка практически всех необходимых расширений, включая файл gdb. Для объединения и совместного использования отдельных таблиц программа характеризуется поддержкой различных модулей, а также полной поддержкой и возможностью управления любой БД на основе механизма Firebird или InterBase.

Используя программу, также можно создать стандартную БД или такие базы данных, которые поддерживают язык запросов SQL. Для образовательных целей программа также доступна в бесплатной версии. Бесплатная лицензия имеет аналогичную функциональность, но ограничивает размер БД до 50 мегабайт. Вся информация о бесплатной версии находится на официальном сайте производителя. IBExpert также позволяет контролировать созданные БД, управлять многоэтапными сценариями и оптимизировать производительность всей базы данных.

ВАЖНО. Доступ к установочному файлу можно получить после бесплатной регистрации на веб-сайте производителя. 

Софт позволяет организовать взаимодействие и визуализацию всех объектов БД, изменять код запросов, SQL, позволяет легко набросать даже сложную БД. Проводит мониторинг и оптимизацию производительности БД. IBExpert оснащён модулем для объединения и совместного чтения существующих таблиц и многоэтапными сценариями с предварительным просмотром результатов отдельных запросов. Кроме того, предоставляется система анализа OLAP, метаданных и документация базовой структуры, а также отладчик хранимых компонентов. Наиболее важные функции программы IBExpert:

  • функция Unicode;
  • мониторинг и оптимизация производительности БД;
  • запуск расширенных SQL-запросов с использованием скриптов;
  • IBExpert позволяет создавать БД с использованием модели;
  • копирование БД;
  • ускорение и оптимизация;
  • IBExpert имеет обширный модуль отчётности;
  • извлечение метаданных для создания копии структуры БД;
  • экспорт в CSV и через ODBC;
  • управление правами пользователей;
  • IBExpert предоставляет подсказки синтаксиса и помощник.

IBExpert – это профессиональная интегрированная среда разработки (IDE) InterBase и Firebird. Содержит множество утилит для кодировщиков, визуальные редакторы для всех компонентов БД, редактор SQL iScript Executive, отладчик и т. д. Это одна из самых полных и обширных программ для управления БД IB и FB, доступных на рынке. Несмотря на огромные возможности, софт интуитивен и не требует особых навыков. Благодаря визуальному управлению базами не понадобятся идеальные познания в синтаксисе DDL или DML, а работа с БД становится намного быстрее и удобнее.

Чтобы открыть файл с расширением .gdb, выполните следующие действия:

  1. На панели инструментов найдите кнопку «База данных». В выпадающем списке выберите «Зарегистрировать базу». 
  2. В появившемся окне настроек необходимо ввести следующие данные:
    • сервер/протокол – local, default;
    • версия – Firebird 2.5;
    • кодировка — UNICODE_FSS;
    • пользователь – sysdba;
    • пароль – masterkey.
  3. Далее нажмите кнопку «Файл базы данных», после чего откроется диалоговое окно, где нужно найти и указать файл gdb. 
  4. Нажмите кнопку «Регистрировать».
  5. ПКМ на загрузившейся БД – «Подключиться к базе». Готово!

Embarcadero InterBase

Embarcadero InterBase – заслуживающий внимания коммерческий софт SQL с функциями защиты данных, синхронизацией и аварийным восстановлением. От одного устройства до небольшого корпоративного решения, InterBase, удостоенный награды IoT, – это выбор разработчиков и глобальное развёртывание ISV. Приложение используется во всём мире – от медицинских, железнодорожных и авиакомпаний до POS, CRM и даже MARS Rover.

Открываем формат gdb в Embarcadero InterBase:

  1. Server – Add;
  2. Next;
  3. Next
  4. Нажмите кнопку Use Default, затем Next;
  5. Finish;
  6. В левой части программы появится новый сервер. Чтобы добавить БД, его нужно «развернуть» и правой кнопкой мыши выбрать «Add»;
  7. В открывшемся окне выберите кнопку с троеточием, далее откроется диалог, где нужно указать путь к файлу gdb;
  8. ОК. Готово!

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

Recovery For Interbase

Recovery For Interbase – это программное обеспечение для восстановления базы данных. Оно использует мощный алгоритм восстановления, делающий процесс быстрее. Ключевая особенность Recovery for Interbase заключается в восстановлении всего содержимого базы данных, например, таблиц, полей и индексов. Чтобы начать восстановление, пользователю просто нужно нажать кнопку «Восстановить» в верхней части интерфейса.

Преимущество Recovery for Interbase заключается также и в том, что он способен сохранять все восстановленные данные в файл SQL. Эти элементы могут быть добавлены в базовые данные с помощью простого просмотра файлов или перетаскивания мышью. Программа может восстанавливать файлы из Interbase и Firebird, Recovery for Interbase поддерживает множество форматов этих типов баз данных, таких как, например, gdb, ib или fdb.

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

  • Софт оснащён интерфейсом, который облегчает все действия.
  • ПО является лёгким и не требует много свободного места на жёстком диске.

Недостатки:

  • В пробной версии восстановление данных недоступно.

Для открытия базы данных в формате gdb необходимо выполнить следующее:

  1. Add files;
  2. Откроется проводник, где нужно указать путь к файлу gdb;
  3. Next;
  4. Next;
  5. Start;
  6. Done;
  7. Готово! База данных восстановлена.

Описанный софт позволит вам без проблем открыть или восстановить базу данных в формате gdb. К использованию рекомендуется первая программа из списка – IBExpert. Она более простая и с ней справится даже неопытный пользователь. Недостатком Embarcadero InterBase является отсутствие русского языка, а Recovery For Interbase поможет при необходимости восстановить повреждённый файл.

Отладка

— Как собрать GDB в Windows

Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
  5. Реклама Обратитесь к разработчикам и технологам со всего мира
  6. О компании

Загрузка…

.

Настройка команды gdb на windows

Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
  5. Реклама Обратитесь к разработчикам и технологам со всего мира
  6. О компании

Загрузка…

.Установка

— gdbgui

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

Метод 1. Использование pipx (рекомендуется)

gdbgui рекомендует использовать pipx, программу для запуска двоичных файлов Python CLI в изолированных средах.

Вы можете установить pipx следующим образом:

  python3 -m pip install --user pipx
python3 -m userpath добавить ~ /.местный / bin
  

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

Затем установите gdbgui с помощью pipx:

Для обновления выполните

По завершении установки введите gdbgui в командной строке, чтобы запустить ее, или gdbgui -h для получения справки.

Для удаления запустите

Попробуйте без установки

Используя pipx, вы можете запускать программы Python CLI в эфемерных одноразовых виртуальных средах.

В вашем браузере откроется новая вкладка с последней версией gdbgui. Нажмите CTRL + C, чтобы завершить процесс, и ваша система останется нетронутой.

Метод 2: Использование пункта

pip — популярный установщик пакетов Python. gdbgui — это пакет Python, поэтому его можно установить с помощью pip, хотя мы рекомендуем использовать pipx , а не pip , если это возможно.

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

Вы можете получить обновления с

  pip install --upgrade gdbgui
  

Для удаления запустите

Метод 3. Загрузите и запустите двоичный исполняемый файл

Загрузите и запустите исполняемый двоичный файл для своей системы с GitHub Releases.

Системные зависимости для пакета Python

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

  • gdb (отладчик GNU)
  • Python 3.4+ (рекомендуется) или 2.7
  • pip версии 8 или выше

Зависимости Linux

  sudo apt-get install gdb python3
  

Зависимости macOS

  brew установить python3
brew install gdb --with-python --with-all-target
  
Пользователи

macOS также должны кодировать gdb: следуйте этим инструкции.Это исправит ошибку , пожалуйста, убедитесь, что gdb имеет кодовую подпись - см. Taskgated (8) .

Зависимости Windows

Обратите внимание, что окна поддерживаются только для версий gdbgui ниже 0,14.

Если у вас еще не установлен gdb / make / gcc, есть два варианта их установки в Windows: MinGW и cygwin .

MinGW (рекомендуется)

Минимальный GNU для Windows ( MinGW ) является рекомендуемым вариантом Windows.Установите MinGW с пакетом «Базовая система MinGW». Это пакет по умолчанию, который содержит make , gcc и gdb .

Он будет установлен где-то вроде C: \ MinGW \ bin \ ... . Например C: \ MinGW \ bin \ gdb.exe , C: \ MinGW \ bin \ mingw32-make.exe и т. Д.

Убедитесь, что этот двоичный каталог MinGW (т.е. C: \ MinGW \ bin \ ) находится в переменной среды «Путь»: перейдите в Панель управления > Свойства системы> Переменные среды> Системные переменные> Путь и убедитесь, что C: \ MinGW \ bin \

.

android ndk — ndk-gdb на windows

Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
  5. Реклама Обратитесь к разработчикам и технологам со всего мира
  6. О компании
.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *