The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

Каталог документации / Раздел "Документация для Linux" / Оглавление документа
next up previous contents index
Next: Интерфейсы gdb и другие Up: Средства программирования в ОС Previous: Ассемблеры gas и nasm   Contents   Index

Отладчик GDB

Отладчиком называется программа, которая выполняет внутри себя другую программу. Основное назначение отладчика - дать возможность пользователю в определенной степени осуществлять контроль за выполняемой программой, то есть определять, что происходит в процессе ее выполнения. Наиболее известным отладчиком для Linux является программа GNU GDB. GDB содержит множество полезных возможностей, но для простой отладки достаточно использовать лишь некоторые из них.

Когда Вы запускаете программу, содержащую ошибки, обнаруживаемые лишь на стадии выполнения, есть несколько вопросов, на которые Вам нужно найти ответ.

Эти действия требуют, чтобы пользователь отладчика был в состоянии

  1. проанализировать данные программы;
  2. получить трассу - список вызовов функций, которые были выполнены, с сортировкой, указывающей кто кого вызывал;
  3. установить точки останова, в которых выполнение программы приостанавливается, чтобы можно было проанализировать данные;
  4. выполнять программу по шагам, чтобы увидеть, что в действительности происходит.

GDB предоставляет все перечисленные возможности. Он называется отладчиком на уровне исходного текста, создавая иллюзию, что Вы выполняете операторы C++ из Вашей программы, а не машинный код, в который они действительно транслируются.

Для иллюстрации мы используем систему, которая компилирует программы на C++ в исполняемые файлы, содержащие машинный код. В результате этого процесса информация об оригинальном коде C++ теряется при трансляции. Отдельный оператор C++ обычно преобразуется в несколько машинных команд, а большинство имен локальных переменных просто теряется. Информация о именах переменных и операторах C++ в Вашей исходной программе не является необходимой для ее выполнения. Поэтому, для правильной работы отладчика на уровне исходного текста, компилятор должен поместить в программу некоторую дополнительную информацию. Обычно ее добавляют к информации, используемой компоновщиком, в исполняемый файл.

Чтобы указать компилятору (gcc), что Вы планируете отлаживать Вашу программу, и поэтому нуждаетесь в дополнительной информации, добавьте ключ -g в опции компиляции и компоновки. Например, если Ваша программа состоит из двух файлов main.C и utils.C, Вы можете откомпилировать ее командами

   gcc -c -g -Wall main.C
   gcc -c -g -Wall utils.C
   gcc -g -o myprog main.ob utils.o

или одной командой

gcc -g -Wall -o myprog main.o utils.o

Обе последовательности команд приводят к созданию исполняемого файла myprog.

чтобы выполнить полученную программу под управлением gdb, введите

gdb myprog

Вы увидите командное приглашение GDB:

(gdb)

Это очень простой, но эффективный тексовый интерфейс отладчика. Его вполне достаточно, чтобы ознакомиться с основными командами gdb.

Когда GDB запускается, Ваша программа в нем еще не выполняется; Вы должны сами сообщить GDB, когда ее запустить. Как только программа приостанавливается в процессе выполнения, GDB ищет определенную строку исходной программы с вызовом определенной функции - либо строку в программе, где произошел останов, либо строку, содержащую вызов функции, в которой произошел останов, либо строку с вызовом функции и т.д. Далее используется термин ``текущее окно'', чтобы сослаться на точку останова.

Как только возникает командное приглашение, Вы можете использовать следующие команды.

help command

Выводит краткое описание команды GDB. Просто help выдает список доступных разделов справки.

run command-line-arguments

Запускает Вашу программу с определенными аргументами командной строки. GDB запоминает переданные аргументы, и простой перезапуск программы с помощью run приводит к использованию этих аргументов.

where

Создает трассу - цепочку вызовов функций, произошедших до попадания программы в текущее место. Синонимом является команда bt.

up

Перемещает текущее окно так, чтобы GDB анализировал место, из которого произошел вызов данного окна. Очень часто Ваша программа может войти в библиотечную функцию - такую, для которой не доступен исходный код, например, в процедуру ввода-вывода. Вам может понадобиться несколько команд up, чтобы перейти в точку программы, которая была выполнена последней.

down

Производит эффект, обратный up.

print E

Выводит значение E в текущем окне программы, где E является выражением C++ (обычно просто переменной). Каждый раз при использовании этой команды, GDB нумерует ее упоминание для будущих ссылок. Например,

(gdb) print A[i] $2 = -16

(gdb) print $2 + ML $3 = -9

сообщает нам, что величина A[i] в текущем окне равна -16, и что при добавлении этого значения к переменной ML получится -9.

quit

Выход из GDB.

Ctrl-c

Если программа запущена через оболочку shell, Ctrl-c немедленно прекращает ее выполнение. В GDB программа приостанавливается, пока ее выполнение не возобновится.

break place

Установить точку останова; программа приостановится при ее достижении. Простейший способ - установить точку останова после входа в функцию, например

(gdb) break MungeData Breakpoint 1 at 0x22a4: file main.C, line 16.

Команда break main остановит выполнение в начале программы.

Вы можете установить точки останова на определенную строку исходного кода:

(gdb) break 19 Breakpoint 2 at 0x2290: file main.C, line 19.

(gdb) break utils.C:55 Breakpoint 3 at 0x3778: file utils.C, line 55.

Когда Вы запустите программу и она достигнет точки останова, Вы увидите сообщение об этом и приглашение, например

Breakpoint 1, MungeData (A=0x6110, N=7) at main.c:16

(gdb)

delete N

Удаляет точку останова с номером N. Если опустить N, будут удалены все точки останова.

cont или continue

Продолжает обычное выполнение программы.

step

Выполняет текущую строку программы и останавливается на следующем операторе для выполнения.

next

Похожа на step, однако, если текущая строка программы содержит вызов функции (так что step должен будет остановиться в начале функции), не входит в эту функцию, а выполняет ее и переходит на следующий оператор.

finish

Выполняет команды next без остановки, пока не достигнет конца текущей функции.


next up previous contents index
Next: Интерфейсы gdb и другие Up: Средства программирования в ОС Previous: Ассемблеры gas и nasm   Contents   Index
Alex Otwagin 2002-12-16


  Закладки на сайте
  Проследить за страницей
Created 1996-2017 by Maxim Chirkov  
ДобавитьРекламаВебмастеруГИД  
Hosting by Ihor