Найти в Дзене
Vim

NeoVim как IDE для C++ ( часть 7, gdb)

Оглавление

gdb


Важно! gdb это тоже что NeoVim. Первая встреча вас может напугать, Но вложив чуть терпения, можно получить массу удовольствия от работы с ним.
Можно настроить классические кнопочки, вперед, назад, показать переменные. Но тут немного другая логика работы. Тут при правильной работе, тебе не надо тыкать 100 раз что бы попасть в нужный блок кода. Например попасть в прошлое после того как программа крашнулась. В gdb ты можешь отлаживать программы вперед и назад, и иметь возможность увидеть что произошло в момент падения. И т.д. Позже напишу пару статеек на эту тему.

Давайте продолжим традицию и собирем gdb из исходников. Сборка займет где то минут 30-40. Можно с репозитория установить... Но разве это интересно?
Можно не дожидаться появления всех предупреждений и установить нужный софт сразу

sudo apt update
sudo apt upgrade
sudo apt-get install libgmp3-dev libmpfr-dev
sudo apt-get install texinfo
sudo apt-get install bison

cd
git clone git://sourceware.org/git/binutils-gdb.git
cd binutils-gdb/
./configure

требование установить GMP, MPFR

error: Building GDB requires GMP 4.2+, and MPFR 3.1.0+.
error: Building GDB requires GMP 4.2+, and MPFR 3.1.0+.

Т.е. наш gdb просит что бы мы установили библиотеки для работы чисел с плавающей точкой больной точности. Давайте установим их. (Если вы видите какие то еще ошибки посмотрите первую часть где мы устанавливали g++ скорее всего одну из ошибок мы уже разбирали.

sudo apt-get install libgmp3-dev libmpfr-dev
./configure
make

требование установить textinfo

You might want to install the Texinfo package
You might want to install the Texinfo package

Но раз он так просит, давайте поставим его

sudo apt-get install texinfo

требование установить bison

You may want to install the GNU Bison package
You may want to install the GNU Bison package
sudo apt-get install bison

ругается опять. Что при загрузке из ./config.cache он получает ошибку.связанную в bison. Но мы же его только что установили.

-4
rm -rf config.cache
make clean
make

Если все равно появляется эта ошибка, удалите все, и званого скачайте проект с гита.
и выполните

./configure
make
sudo make install

перезапускаем терминал.

-5
gdb --configuration

Исправляем свои ошибки


Вот ешкин матрешкин. Мы собрали gdb без поддержки питона... да и подсветки кода хотелось бы видеть... ай как не хорошо вышло. Исправляемся. Я решил собрать его с теми же настройками с которыми он обычно идет в системе.

-6

cd ~/binutils-gdb

./configure --with-expat --with-gdb-datadir=/usr/share/gdb --with-jit-reader-dir=/usr/local/lib/gdb --without-libunwind-ia64 --with-lzma --with-babeltrace --with-intel-pt --with-xxhash --with-python=/usr/bin/python3 --with-python-libdir=/usr/local/lib --with-debuginfod --with-curses --without-guile --without-amd-dbgapi --enable-source-highlight --enable-threading --enable-tui --with-system-readline --with-separate-debug-dir=/usr/local/lib/debug

Обрати внимание на подобные строчки: --with-python=/usr/bin/python3
тут надо указать где ваши программы лежат. Можно попробывать и не указывать явно путь к программам, но тогда есть шанс получить ошибку, что он не может собрать программу, так как не может найти нужные библиотеки и программы. Так что если вы устанавливали их из репозитория, то можно все оставить как есть. Если вы их собирали из исходников то скорее всего они будут лежать у вас по пути: /usr/locale/...

Начинаем подготовку к сборке gdb.

sudo apt udpate
sudo apt upgrade


установить
guile
sudo apt install guile-3.0-dev
Назначение: выполнение различных сценариев

библиотека
libdebuginfod
sudo apt-get install libdebuginfod-dev
нужна для отладки и файлов ELF/DWARF (можно больше вещей отлаживать)

библиотека
eadline
sudo apt-get install libreadline-dev
Назначение: для чтения и редактирования строк в терминале

библиотека
libipt
sudo apt install libipt-dev
назначение: для работы с процессором intel

библиотека
xxhash
sudo apt install libxxhash-dev
назначение: для работы с хеш функциями.

библиотеки для
Python
sudo apt-get install python3-dev libpython3-dev
необходимы для работы и разработки на языке python

библиотека:
source-highlight
sudo apt install libsource-highlight-dev
Назначение: подсветка синтаксиса в исходном коде

библиотека
liblzma
sudo apt-get install liblzma-dev
назначение: архиватор LZMA

библиотека
libbabeltrace
sudo apt-get install libbabeltrace-dev
назначение: так же нужна для сжатия и распаковки файлов .lzma и .xz.
make -j5
sudo make install

тут: make -j5 число 5 это количество потоков которые мы выделяем для сборки проекта.
Проверяем... Кажись все ли получилось.

-7


настройка NeoVim для работы с gdb

:packadd termdebug

-8

компилируем программу
g++ -ggdb ./main.cpp

далее в NeoVim вводим:

:Termdebug ./a.out

-9

1) Верхнее окно это окно с кодом.
2) Среднее окно это окно вывода программы. Само собой его можно вынести в отдельное окно терминала (в терминале набираем
tty получаем строку вида: /dev/pts/1 а в окне gdb пишем tty /dev/pts/1 . Все, теперь весь вывод будет в другом терминале.)
3) Нижнее окно. Это окно нашего отладчика gdb
Переключаться между окнами <ctrl ww>
Поместите курсор на окно с кодом <ctrl wL> так мы переместим окно с кодом вправо.

Далее особенность работы в окне gdb. Точно такая же особенность, если мы вызовем окно терминала <alt h>
По умолчанию мы находимся в "нормальном режиме" для того что бы иметь возможность что то написать там. надо перейти в режим "вставка"
i или a.
Для того чтобы вернуться в "нормальный" режим и иметь возможность копировать код, перемещаться между окнами и тд. <ctrl x>

Перемещаемся в окно с кодом, встаем, на ту строчку где хотим остановиться и набираем
:Break

-10

Но проще, и удобней отлаживаться в самом gdb. выходим из NeoVim qa!
Запускаем gdb
gdb ./a.out
либо можно запустить так, тогда gdb запуститься с минимальным выводом информации.
gdb ./a.out -q
А что бы запустить аля-графический интерфейс.
gdb ./a.out -q -tui

Если мы находимся в отладчике и мы захотим здесь и сейчас сделать правку в коде. То не выходя из gdb набирайте
edit номер строки
и у нас тут же отроится наш редактор по умолчанию, который мы задаем в файле настройки консоли. ~/.bashrc или если у вас zsh ~/.zshrc
export EDITOR="nvim"
Правку то сделали но у gdb нет супер силы, поэтому не забудте перекомпилировать ваш проект.
Это можно сделать также прямо в gdb.
make
либо
shell g++ -ggdb3 main.cpp -std=c++23 .....
а дальше как обычно
start, или run

Минимально что надо знать:
1) start начать отлаживать программу. run начать выполнять программу до первой точки останова.
2)
n - шаг вперед
3)
s - шаг с заходом
4) просто нажать
enter он повторяет предыдущую введеную команду.
5)
с - продолжить выполнять программу до ближайщей точки останова
6)
break 20 поставить точку останова на 20 строке. gdb имеет возможности поставить точки останова тучей разных способов.
7)
finish закончить выполнение фунции.

Точки останова могут быть.
Точками наблюдения. (когда нам надо остановиться когда переменная примет определенное значение) Например останавливаемся когда поток 3 сделает изменения в функции foo (watch foo thread 3). Или например остановится когда i будет прочитан (rwatch i) или записан(watch i), или он достигнет определенного значения (watch i if i > 10) и тд.
Точками перехвата (Обработка событий). Было брошено исключение. Кстати мы можем связать gdb с valgrind и тогда более точно сможем отлавливать ошибки. Когда программа почти упала (break abort). Точка останова удаляется как только событие произошло, т.е. дважды в одно и тоже место мы долбиться не будем.)
Можем так же сделать точку останова только тогда, когда функция А будет вызвана функцией Б.

Можем так же на точку останова навешивать различный функционал. Позже обязательно все расскажу.

Назад часть 6, перемещение по тексту, нейросеть
далее
часть 8 GDB, настройка, работа с gdb