Краткое описание отладчика GDB
Основные возможности отладчика GDB (GNU Debugger)
символьная отладка программ как в терминах языков высокого уровня (СИ,
СИ++, Модула-2), так и языка ассемблера (уровень машинных команд);
запуск программ под управлением отладчика, анализ посмертного дампа (core-файла)
аварийно завершившихся программ, "подключение" к уже выполняющейся программе;
пошаговое выполнение программ;
установка точек останова (возможно, условных) в программе;
просмотр стеков вложенных вызовов функций (процедур);
установка точек слежения за переменными программы;
изменение естественного хода вычислительного процесса в программе;
измение исполняемого кода программы;
работа практически во всех распространенных универсальных ОС и на всех
машинных архитектурах
кросс-отладка программ.
Отладчик GDB является свободно распространяемым ПО организации GNU.
Интерфейс с пользователем организован "через командную строку", но имеется
развитая свободно распространяемая графическая оболочка DDD
(Data Display Debugger).
Ниже дается краткое описание наиболее часто ислользуемых команд отладчика
GDB.
Компиляция программы
gcc -g -o prog prog.c
prog.c - имя файла с исходным текстом программы;
prog - имя исполняемого файла программы;
-g - опция включения в исполняемый файл информации для символьной отладки.
Запуск отладчика
gdb prog
отладка программы prog под управлением отладчика
gdb prog core
анализ посмертного дампа программы prog
gdb prog pid
"подключение" отладчика к уже выполняющейся программе prog с
идентификатором процесса pid
gdb -h
справка о всех возможных опциях отладчика
Команды отладчика
Команды отладчика вводятся в ответ на приглашение (gdb).
Команда состоит из имени и (необязательно) нескольких аргументов. Разделителем
служит один или более пробелов.
Имя любой команды может быть сокращено справа до уникальной последовательности
букв. Имена наиболее часто используемых команд могут быть сокращены до
одной начальной буквы без коллизий с именами других команд.
Ввод пустой строки в качестве команды иницирует повторение последней выполненной
команды.
Клавиши "стрелки" могут быть использованы для просмотра истории ранее выполненных
команд и их редактирования.
Клавиша табуляции ТАБ может быть использована для дополнения любых слов,
составляющих команду. Если после нажатия ТАБ раздается звуковой сигнал,
то это означает, что существует несколько возможностей достроить слово;
повторное нажатие ТАБ выдает список всех возможных вариантов продолжения.
Подсказку по командам отладчика можно получить командой help.
Команда quit завершает работу отладчика.
Выполнение программы
set environment varname value
установить/переустановить переменную среды varname в значение
value
show environment varname
показать значение переменной среды varname
unset environment varname
удалить переменную среды varname
set args [arg1 ...]
задать аргументы программы
show args
показать аргументы программы
run (или r)
запустить программу на выполнение под управлением отладчика
Доступ к исходному тексту
list (или l) funcname
распечатать порцию исходного текста программы, начиная с функции funcname
list (или l) linenum
распечатать порцию исходного текста программы вокруг строки с номером
linenum
list (или l)
распечатать следующую порцию исходного текста программы
list (или l) -
распечатать предыдущую порцию исходного текста программы
show listsize
показать размер порции распечатываемого текста
set listsize n
установить размер порции распечатываемого текста к величине n
строк текста
Доступ к машинному коду
disassemble
распечатать машинный код (используя язык ассемблера) функции, включающей
в себя адрес текущей точки останова
disassemble funcname
распечатать машинный код функции по имени funcname
disassemble address
распечатать машинный код функции, покрыващей своим кодом адрес address
disassemble s_addr end_addr
распечатать машинный код в диапазоне адресов s_addr - end_addr
info line linenum
выдать начальный и конечный адреса машинного кода строки исходного
текста с номером linenum
info line *address
выдать номер строки исходного текста, начальный и конечный адреса ее
машинного кода для строки, покрывающей адрес address
Точки останова (breakpoints)
break funcname
установить точку останова в начало функции funcname
break linenum
установить точку останова в строке номер linenum исходного файла
break +offset break -offset
установить точку останова в строке исходного текста, отстоящей от текущей
позиции на offset строк вперед/назад
break *address
установить точку останова на машинную инструкцию по адресу address
whatch expr
установить слежение за изменением выражения expr
condition bn lexpr
связать с точкой останова номер bn логическое условие lexpr
(записанное по правилам языка СИ/СИ++)
commands bn
связать с точкой останова номер bn список команд отладчика,
выполняемых автоматически при каждом останове
info break [bn]
выдать информацию о точке останова номер bn
disable [bn]
сделать неактивной точку останова номер bn
enable [bn]
активировать точку останова номер bn
delete [bn]
удалить точку останова номер bn
Продолжение после останова
continue (или c)
продолжить выполнение программы с места последней точки останова
step (или s)
выполнить следующую строку исходного текста программы (даже если эта
строка внутри вызываемой функции) и остановиться
step (или s) n
выполнить следующих n строк исходного текста программы (даже
если эти строки внутри вызываемой функции) и остановиться
next (или n) [n]
выполнить следующих n строк исходного текста программы (строки
вызываемых функций в число n не включаются и останова в них не происходит)
и остановиться
finish
продолжить выполнение программы и остановиться в вызывающей
функции на следующем операторе после вызова текущей функции
stepi (или si) [n]
выполнить строго n машинных инструкций и остановиться
nexti (или ni) [n]
выполнить n машинных инструкций и остановиться (однако, если
среди этих инструкций есть вызовы функций, то эти функции выполняются без
останова и их инструкции в число n не включаются)
Доступ к стеку вызова функций
backtrace (или bt)
выдать список вложенных вызовов функций прикладной программы (от функции,
в которой произошел останов, до функции main) с указанием аргументов и
мест вызова
Доступ к переменным программы
print (или p) expr
выдать значение выражения expr, сконструированного по правилам
языка СИ/СИ++ с использованием переменных программы; значение выводится
в формате, соответствующем типу данных всего выражения
print/f expr
выдать значение выражения expr в формате f Допустимыми спецификациями формата являются:
x - шестнадцатиричное целое;
d - десятичное целое со знаком;
u - десятичное целое без знака;
o - восьмеричное число;
t - двоичное число (от two);
a - адрес;
c - однобайтовый символ;
f - число с плавающей точкой.
print/f
заново выдать последнее значение в формате f
Выражение expr помимо конструкций языка СИ/СИ++ может включать в
себя:
{type}addr
объект типа type, располагающийся в памяти по адресу addr,
где addr может быть любым выражением, имеющим результат в виде целого
или указателя
funcname::static-var
статическая переменная static-var из функции по имени funcname
Доступ к памяти
x [/[n][f][u]]
addr выдать содержимое памяти программы по адресу addr, используя
следующие спецификации вывода:
f - формат вывода (один символ), используемый в качестве формата
вывода команды print ("умолчанием" здесь является x - шестнадцатиричное
целое длиной в 4 байта);
u - размер выводимого объекта:
b - байт
h - полуслово (2 байта)
w - слово (4 байта)
g - "гигантское" слово (8байт);
n - счетчик количества выводимых объектов (1 - значение "по умолчанию")
Доступ к регистрам
info registers
выводит имена и содержимое (в шестнадцатиричной и десятичной формах)
всех регистров общего назначения
info all-registers
выводит имена и содержимое всех регистров программы
info registers regname1 [regname2 ... ]
выводит содержимое регистров с именами regname1, regname2
...
Примечание. Имена регистров определяются используемым ассемблером эксплуатируемой
машины. В GDB принято имена регистров предварять символом "$" (например,
в GDB $esp означает регистр указателя стека %esp ассемблера
фирмы Sun Microsystems для микропроцессора серии X86* фирмы Intel).
Примечание. Конструкция $regname в командах GDB (кроме команды
set) трактуется как "содержимое регистра regname", например:
x/xw $ebp+8
выдать в виде шестнадцатиричного целого числа содержимое одного слова
(4 байта) памяти, адрес которого определяется как сумма содержимого регистра
ebp и числа 8;
x/s *(char *)($esp+4)
выдать в символьном виде содержимое последовательности байтов памяти,
начальный адрес которых содержится в слове памяти (4 байта), адрес которого
вычисляется как сумма содержимого регистра esp и числа 4.
Изменения в программе
set var varname = expr
присвоить переменной varname программы значение выражения expr
set $regname = expr
присвоить регистру regname значение выражения expr
set {type}addr = expr
присвоить значение выражения expr переменной типа type
(допустимы типы данных языка СИ), расположенной в памяти по адресу addr.
Данным способом можно модифицировать исполняемый машинный код программы,
если он доступен для записи, и если в начале сеанса отладки была выдана
команда set write on.
Прочие полезные команды
file prog exec-file prog
начать сеанс отладки программы prog
source filename
выполнить последовательность команд отладчика из файла с именем filename