Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Как пользоваться GDB

Ниже приведены некоторые полезные команды GDB, которые помогут отлаживать программы. Предполагается, что вы прошили программу в микроконтроллер и подключили GDB к сеансу cargo-embed.

Общая отладка

ПРИМЕЧАНИЕ: Многие команды ниже можно записывать в сокращённом виде. Например, continue можно записать как c, а break $location — как b $location. Когда освоитесь с командами ниже, попробуйте выяснить, насколько их можно укоротить, прежде чем GDB перестанет их распознавать!

Работа с точками останова

  • break $location: установить точку останова в месте вашего кода. Значение $location может быть таким:
    • break *main — остановка по точному адресу функции main
    • break *0x080012f2 — остановка по точному адресу памяти 0x080012f2
    • break 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.rs
    • clear main.rs:123: удалить точку останова на строке 123 main.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: продолжить выполнение со строки 123
    • jump 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 машинных инструкций, начиная с адреса 0x080012c4
    • x/4xb $pc: вывести 4 байта памяти, начиная с адреса, на который сейчас указывает $pc
  • disassemble $location

    • disassemble /r main: дизассемблировать функцию main; /r показывает байты, из которых состоит каждая инструкция

Просмотр таблицы символов

  • info functions $regex: вывести имена и типы данных функций, подходящих под $regex; без $regex выводятся все функции
    • info functions main: вывести имена и типы определённых функций, в названии которых есть слово main
  • info address $symbol: показать, где в памяти хранится $symbol
    • info address GPIOC: показать адрес в памяти переменной GPIOC
  • info variables $regex: вывести имена и типы глобальных переменных, подходящих под $regex; без $regex выводятся все глобальные переменные
  • ptype $data: вывести более подробную информацию о $data
    • ptype 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: сбросить процессор и начать выполнение заново