Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №23 / Для лабы 2 по ОС.doc
Скачиваний:
15
Добавлен:
01.05.2014
Размер:
147.46 Кб
Скачать

Отладчик 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 без остановки, пока не достигнет конца текущей функции.

NM(1)

НАЗВАНИЕ nm - вывод таблицы имен об ектного файла обычного формата

СИНТАКСИС

nm [-o] [-x] [-h] [-v] [-n] [-e] [-f] [-u] [-r] [-p] [-V] [-T] файл ...

ОПИСАНИЕ Команда nm выдает на стандартный вывод таблицу имен для каждого об ектного файла, указанного в командной строке. Файл может быть как перемещаемым, так и абсолютным об ектным файлом, или может быть архивом из таких файлов. Для каждого элемента таблицы выдается следующая информация:

Name

Имя элемента таблицы.

Value

Значение, выражаемое как смещение или адрес, в зависимости от класса хранения.

Class

Класс хранения.

Type

Информация о типе. Если элемент описывает экземпляр структуры или об единения, то за типом будет выведено имя структуры или об единения (например, struct-имя). Если элемент соответствует массиву, то размер массива будет указан за типом (например, char[n][m]). Заметим, что для наличия этой информации файл должен быть откомпилирован командой cc(1) с опцией -g.

Size

Размер в байтах, если он определен. Заметим, что для наличия этой информации файл должен быть откомпилирован командой cc(1) с опцией -g.

Line

Номер строки в файле с исходным текстом, в которой об ект определяется, если эта информация имеет смысл. Заметим, что для наличия этой информации файл должен быть откомпилирован командой cc(1) с опцией -g.

Section

Для об ектов с классом хранения статический (static) и внешний (extern) указывается секция, которой принадлежит об ект: секция команд (.text), секция инициализированных данных (.data) или секция неинициализированных данных (.bss).

Следующие опции определяют содержание и формат информации, выдаваемой командой nm:

-o

Выводить значение и размер в восьмеричном виде, а не в десятичном.

-x

Выводить значение и размер в шестнадцатеричном виде, а не в десятичном.

-h

Не выводить заголовок.

-v

Отсортировать внешние об екты по значению.

-n

Отсортировать внешние об екты по алфавиту.

-e

Выдавать только статические и внешние об екты.

-f

Выдавать всю информацию. Выводятся обычно подавляемые избыточные элементы таблицы имен (.text, .data, .lib, .bss).

-u

Выводить только неопределенные об екты.

-r

Добавлять в начале каждой выводимой строки имя об ектного файла или архива.

-p

Выводить в легко обозримом, кратком формате. Перед именем каждого об екта стоит его значение (пробелы, если не определено) и одна из следующих букв: U (неопределенный), A (абсолютный), T (входит в секцию команд), D (входит в секцию данных), S (входит в секцию, определенную пользователем), R (располагается в регистре), F (файл) или C (входит в общий блок). Информация о локальных (не внешних) об ектах выдается малыми буквами.

-V

Вывести в стандартный протокол информацию о версии команды nm.

-T

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

Опции можно использовать в произвольном порядке, вместе или по отдельности, и в произвольном месте командной строки. Так, команды

nm f1 -e -v

и

nm -ve f1

работают одинаково: выдают статические и внешние об екты файла с сортировкой внешних об ектов по значению.

ФАЙЛЫ

TMPDIR/* Временные файлы.

Обычно каталог TMPDIR - это /usr/tmp, однако данное соглашение можно изменить, присвоив переменной окружения TMPDIR другое значение [см. tempnam( ) в tmpnam(3S)].

СМ. ТАКЖЕ as(1), cc(1), ld(1). tmpnam(3S), a.out(4), ar(4) в Справочнике программиста.

ДИАГНОСТИКА

nm: файл: cannot open

Файл не удается открыть.

nm: файл: bad magic

Файл не является об ектным файлом обычного формата.

nm: файл: no symbols

Файл не содержит таблицы имен.

СЮРПРИЗЫ В ситуации, когда выводятся все об екты, для сохранения локализации информации нужно, чтобы об екты выводились в том порядке, в каком они хранятся в таблице имен. Следовательно, опции -v и -n следует использовать только вместе с опцией -e.

objdump

objdump [ -a | --archive-headers ]         [ -b bfdname | --target=bfdname ] [ --debugging ]         [ -d | --disassemble ] [ -D | --disassemble-all ]         [ -f | --file-headers ]         [ -h | --section-headers | --headers ]         [ -i | --info ]         [ -j section | --section=section ]         [ -l | --line-numbers ] [ -S | --source ]         [ -m machine | --architecture=machine ]         [ -r | --reloc ] [ -R | --dynamic-reloc ]         [ -s | --full-contents ] [ --stabs ]         [ -t | --syms ] [ -T | --dynamic-syms ]         [ -x | --all-headers ]         [ -w | --wide ] [ --start-address=address ]         [ --stop-address=address ]         [ --show-raw-insn ]         [ --version ]         [ --help ]         objfile...

objdump displays information about one or more object files. The options control what particular information to display. This information is mostly useful to programmers who are working on the compilation tools, as opposed to programmers who just want their program to compile and work.

objfile... are the object files to be examined. When you specify archives, objdump shows information on each of the member object files.

The long and short forms of options, shown here as alternatives, are equivalent. At least one option besides ‘-l’ must be given.

-a

--archive-header If any of the objfile files are archives, display the archive header information (in a format similar to ‘ls -l’). Besides the information you could list with ‘ar tv’, ‘objdump -a’ shows the object file format of each archive member.

-b bfdname

--target=bfdname Specify that the object-code format for the object files is BFD-name. This option may not be necessary; objdump can automatically recognize many formats.

objdump -b oasys -m vax -h fu.o

The previous example displays summary information from the section headers (‘-h’) of ‘fu.o’, which is explicitly identified (‘-m’) as a VAX object file in the format produced by Oasys compilers. You can list the formats available with the ‘-i’ option. See “Target Selection” on page 37, for more information.

--debugging Display debugging information. This attempts to parse debugging information stored in the file and print it out using a C like syntax. Only certain types of debugging information have been implemented.

-d

--disassemble Display the assembler mnemonics for the machine instructions from objfile. This option only disassembles those sections which are expected to contain instructions.

-D

--disassemble-all Like ‘-d’, but disassemble the contents of all sections, not just those expected to contain instructions.

-f

--file-header Display summary information from the overall header of each of the objfile files.

-h

--section-header

--header Display summary information from the section headers of the object file.

File segments may be relocated to nonstandard addresses, for example by using the ‘-Ttext’, ‘-Tdata’, or ‘-Tbss’ options to ld. However, some object file formats, such as a.out, do not store the starting address of the file segments. In those situations, although ld relocates the sections correctly, using ‘objdump -h’ to list the file section headers cannot show the correct addresses. Instead, it shows the usual addresses, which are implicit for the target.

--help Print a summary of the options to objdump and exit.

-i

--info Display a list showing all architectures and object formats available for specification with ‘-b’ or ‘-m’.

-j name

--section=name Display information only for section name.

-l

--line-numbers Label the display (using debugging information) with the filename and source line numbers corresponding to the object code shown. Only useful with ‘-d’ or ‘-D’.

-m machine

--architecture=machine Specify that the object files objfile are for architecture machine. You can list available architectures using the ‘-i’ option.

-r

--reloc      Print the relocation entries of the file. If used with ‘-d’ or ‘-D’, the relocations are printed interspersed with the disassembly.

-R

--dynamic-reloc      Print the dynamic relocation entries of the file. This is only meaningful for dynamic objects, such as certain types of shared libraries.

-s

--full-contents Display the full contents of any sections requested.

-S

--source Display source code intermixed with disassembly, if possible.

Implies ‘-d’.

--show-raw-insn When disassembling instructions, print the instruction in hex as well as in symbolic form. Not all targets handle this correctly yet.

--stabs Display the full contents of any sections requested. Display the contents of the .stab and .stab.index and .stab.excl sections from an ELF file. This is only useful on systems (such as Solaris 2.0) in which .stab debugging symbol-table entries are carried in an ELF section. In most other file formats, debugging symbol-table entries are interleaved with linkage symbols, and are visible in the ‘--syms’ output. For more information on stabs symbols, see .stabd, .stabn, .stabs in Using as.

--start-address=address      Start displaying data at the specified address. This affects the output of the -d, -r and -s options.

--stop-address=address      Stop displaying data at the specified address. This affects the output of the -d, -r and -s options.

-t

--syms      Print the symbol table entries of the file. This is similar to the information provided by the ‘nm’ program.

-T

--dynamic-syms Print the dynamic symbol table entries of the file. This is only meaningful for dynamic objects, such as certain types of shared libraries. This is similar to the information provided by the ‘nm’ program when given the ‘-D’ (‘--dynamic’) option.

--version Print the version number of objdump and exit.

-x

--all-header Display all available header information, including the symbol table and relocation entries.

Using ‘-x’ is equivalent to specifying all of ‘-a -f -h -r -t’.

-w

--wide Format some lines for output devices having more than 80 columns.

objdump(1) GNU Development Tools objdump(1)

NAME

objdump - display information from object files.

Соседние файлы в папке Лабораторная работа №23