Как пользоваться GDB
Ниже приведены некоторые полезные команды GDB, которые помогут отлаживать программы. Предполагается, что вы прошили программу в микроконтроллер и подключили GDB к сеансу cargo-embed.
Общая отладка
ПРИМЕЧАНИЕ: Многие команды ниже можно записывать в сокращённом виде. Например,
continueможно записать какc, аbreak $location— какb $location. Когда освоитесь с командами ниже, попробуйте выяснить, насколько их можно укоротить, прежде чем GDB перестанет их распознавать!
Работа с точками останова
break $location: установить точку останова в месте вашего кода. Значение$locationможет быть таким:break *main— остановка по точному адресу функцииmainbreak *0x080012f2— остановка по точному адресу памяти0x080012f2break 123— остановка на строке 123 текущего файлаbreak main.rs:123— остановка на строке 123 файлаmain.rs
info break: показать текущие точки остановаdelete: удалить все точки остановаdelete $n: удалить точку останова$n(n— число, например:delete $2)
clear: удалить точку останова на следующей инструкцииclear main.rs:$function: удалить точку останова на входе в$functionвmain.rsclear main.rs:123: удалить точку останова на строке 123main.rs
enable: включить все установленные точки остановаenable $n: включить точку останова$n
disable: отключить все установленные точки остановаdisable $n: отключить точку останова$n
Управление выполнением
continue: начать или продолжить выполнение программыnext: выполнить следующую строку программыnext $n: повторитьnext$nраз
nexti: то же, чтоnext, но для машинных инструкцийstep: выполнить следующую строку; если в ней есть вызов другой функции, войти в её кодstep $n: повторитьstep$nраз
stepi: то же, чтоstep, но для машинных инструкцийjump $location: продолжить выполнение с указанного места:jump 123: продолжить выполнение со строки 123jump 0x080012f2: продолжить выполнение с адреса 0x080012f2
Вывод информации
-
print /$f $data— вывести значение переменной$data. Вывод можно форматировать с помощью$f, который может быть таким:x: шестнадцатеричный d: десятичный со знаком u: десятичный без знака o: восьмеричный t: двоичный a: адрес c: символ f: с плавающей точкойprint /t 0xA: выводит шестнадцатеричное значение0xAв двоичном виде (0b1010)
-
x /$n$u$f $address: посмотреть память по адресу$address. Необязательно:$n— количество единиц для вывода,$u— размер единицы (байты, полуслова, слова и т. д.),$f— любой из форматовprint, описанных вышеx /5i 0x080012c4: вывести 5 машинных инструкций, начиная с адреса0x080012c4x/4xb $pc: вывести 4 байта памяти, начиная с адреса, на который сейчас указывает$pc
-
disassemble $locationdisassemble /r main: дизассемблировать функциюmain;/rпоказывает байты, из которых состоит каждая инструкция
Просмотр таблицы символов
info functions $regex: вывести имена и типы данных функций, подходящих под$regex; без$regexвыводятся все функцииinfo functions main: вывести имена и типы определённых функций, в названии которых есть словоmain
info address $symbol: показать, где в памяти хранится$symbolinfo address GPIOC: показать адрес в памяти переменнойGPIOC
info variables $regex: вывести имена и типы глобальных переменных, подходящих под$regex; без$regexвыводятся все глобальные переменныеptype $data: вывести более подробную информацию о$dataptype cp: вывести подробную информацию о типе переменнойcp
Изучение стека программы
backtrace $n: вывести трассировку из$nкадров; без$nвыводятся все кадрыbacktrace 2: вывести трассировку первых 2 кадров
frame $n: выбрать кадр с номером или адресом$n; без$nпоказывается текущий кадрup $n: выбрать кадр на$nуровней вышеdown $n: выбрать кадр на$nуровней нижеinfo frame $address: описать кадр по адресу$address; без$address— текущий выбранный кадрinfo args: вывести аргументы выбранного кадраinfo registers $r: вывести значение регистра$rв выбранном кадре; без$r— все регистрыinfo registers $sp: вывести значение регистра указателя стека$spв текущем кадре
Удалённое управление cargo-embed
monitor reset: сбросить процессор и начать выполнение заново