Главная | Контакты | Настройки СМЕНИТЬ ПАЛИТРУ:

Главная > Программы

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

Материал взят с сайта:

Главная > Программы