Краткое описание отладчика 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
info variables
выдать информацию о всех переменных программы