Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

Type "apropos word" to search for commands related to "word".

Command name abbreviations are allowed if unambiguous,

(gdb)

Сам по себе отладчик gdb — приложение, выполняющееся в текстовом режиме, но он предоставляет несколько сокращенных клавишных команд для выполнения повторяющихся задач. Во многих версиях есть редактирование в командной строке с хронологией команд, так что вы можете прокрутить список назад и выполнить ту же команду снова (попробуйте воспользоваться клавишами перемещения курсора). Все версии отладчика поддерживают "пустую команду"; нажатие клавиши <Enter>

выполняет последнюю команду еще раз. Это особенно удобно при проверке выполнения программы в построчном режиме с помощью команд
step
или
next
.

Для завершения работы gdb применяйте команду

quit
.

Выполнение программы

Выполнить программу можно с помощью команды

run
. Любые аргументы, переданные вами команде
run
, пересылаются в программу как ее собственные аргументы. В данном случае вам не нужны никакие аргументы.

Предположим, что ваша система, как и системы обоих авторов, теперь генерирует сообщение о нарушении сегментации памяти. Если нет, читайте дальше. Вы узнаете, что делать, когда одна из ваших программ действительно сгенерирует сообщение о нарушении сегментации. Если вы не получили такого сообщения, но хотите поработать с этим примером во время чтения книги, когда первая из проблем, связанных с доступом к памяти, будет устранена, можно взять программу из файла debug4.c.

(gdb) run

Starting program: /home/neil/BLP4e/chapter10/debug3

Program received signal SIGSEGV, Segmentation fault. 

0x0804846f in sort (a=0x804a040, n=5) at debug3.c:23

23 /* 23 */ if(a[j].key > a[j+1].key) {

(gdb)

Программа, как и прежде, выполняется неверно. Когда программа дает сбой, gdb указывает причину и местонахождение. Теперь вы можете выяснять первопричину проблемы.

В зависимости от ядра вашей системы, версий библиотеки С и компилятора сбой программы может произойти в другом месте, например в строке 25, когда элементы массива меняются местами, а не в строке 23, когда сравниваются поля

key
элементов массива. Если это так, вы увидите следующее сообщение:

Program received signal SIGSEGV, Segmentation fault.

0x8000613 in sort (a=0x8001764, n=5) at debug3.c:25

25 /* 25 */ a[j] = a[j+1];

Вы все равно можете продолжать следить за примером сеанса работы gdb, который описывается далее.

Трассировка стека

Программа была остановлена при выполнении функции

sort
в строке 23 исходного файла debug3.c. Если при компиляции вы не включили в программу дополнительную отладочную информацию (
cc -g
), то не сможете увидеть, где программа дала сбой, и использовать имена переменных для просмотра данных.

Увидеть, как вы добрались до этого места, можно с помощью команды

backtrace
:

(gdb) backtrace

#0 0x0804846f in sort (a=0x804a040, n=5) at debug3.c:23

#1 0x08048583 in main at debug3.c:37

(gdb)

Это

очень простая программа и трассировка у нее короткая, т.к. вы не вызывали много функций из других функций. Вы только видите, что
sort
была вызвана из
main
в строке 37 того же файла debug3.c. Обычно проблема гораздо сложнее, и команда
backtrace
применяется для определения маршрута, который привел к месту ошибки. Эта информация очень полезна при отладке функций, вызываемых из множества разных мест.

У команды

backtrace
есть сокращенная форма
bt
и для совместимости с другими отладчиками есть команда
where
, выполняющая ту же функцию.

Просмотр переменных

Отладчик вывел данные в момент остановки программы, и в трассировке стека показаны значения аргументов функции.

Функция

sort
была вызвана с параметром
а
, значение которого 0х804а040. Это адрес массива. Обычно он в различных системах разный и зависит от используемых компилятора и операционной системы.

Сбойная строка 23 — сравнение одного элемента массива с другим:

/* 23 */ if (a[j].key > a[j+1].key) {

Отладчик можно применять для просмотра содержимого параметров функции, локальных переменных и глобальных данных. Команда

print
отображает содержимое переменных и других выражений:

(gdb) print j

$1 = 4

Вы видите, что у локальной переменной

j
значение
4
. Любые значения, выводимые командами gdb, подобными данной, сохраняются для будущего использования в псевдопеременных. В данном случае переменной
$1
присвоено значение 4, на случай, если она вам позже понадобится. Последующие команды будут сохранять свои результаты в переменных
$2
,
$3
и т.д.

Значение переменной

j
, равное 4, означает, что программа попыталась выполнить оператор

if (а[4].key > а[4+1].key)

У массива

array
, который вы передали функции
sort
, только пять элементов, которые пронумерованы от 0 до 4. Поэтому данный оператор считывает несуществующий элемент массива
array[5]
. Переменная цикла
j
приняла некорректное значение.

Если ваша программа завершилась в строке 25, система обнаружила чтение за пределами массива, только когда взялась за перестановку элементов массива, выполнив оператор

/* 25 */ а[j] = a[j+1];

который при

j
, равной 4, дает в результате

а[4] = а[4+1];

Просмотреть элементы передаваемого массива можно, применив выражение в команде

print
. В программе gdb вы можете использовать почти любое допустимое выражение языка С для вывода значения переменной, элемента массива или указателя.

(gdb) print а[3]

$2 = {data = "alex", '\0' <repeats 4091 times>, key = 1}

Поделиться:
Популярные книги

Путеводитель по Библии (Ветхий завет. Новый завет)

Азимов Айзек
Религия и эзотерика:
религия
5.80
рейтинг книги
Путеводитель по Библии (Ветхий завет. Новый завет)

Последний Паладин. Том 10

Саваровский Роман
10. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 10

Туман. Авель Санчес; Тиран Бандерас; Салакаин отважный. Вечера в Буэн-Ретиро

де Унамуно Мигель
141. Библиотека всемирной литературы
Проза:
классическая проза
5.00
рейтинг книги
Туман. Авель Санчес; Тиран Бандерас; Салакаин отважный. Вечера в Буэн-Ретиро

Газлайтер. Том 1

Володин Григорий Григорьевич
1. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 1

AntiBoyarЪ. Трилогия

Соколов Сергей Александрович
AntiBoyarЪ
Фантастика:
фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
AntiBoyarЪ. Трилогия

Трактат об электричестве и магнетизме

Максвелл Джеймс Клерк
146. Классики науки
Научно-образовательная:
прочая научная литература
физика
5.00
рейтинг книги
Трактат об электричестве и магнетизме

Александр Иванович Шокин. Портрет на фоне эпохи

Коллектив авторов
6. Созидатели отечественной электроники
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Александр Иванович Шокин. Портрет на фоне эпохи

Ветхий Завет. Перевод и комментарии

Щедровицкий Дмитрий Владимирович
Религия и эзотерика:
прочая религиозная литература
5.00
рейтинг книги
Ветхий Завет. Перевод и комментарии

Лекарь

Назимов Константин Геннадьевич
2. Травник
Фантастика:
фэнтези
5.25
рейтинг книги
Лекарь

Антипсихология

Ивакин Алексей Геннадьевич
Научно-образовательная:
психология
6.00
рейтинг книги
Антипсихология

В лапах зверя

Зайцева Мария
1. Звериные повадки Симоновых
Любовные романы:
остросюжетные любовные романы
эро литература
5.00
рейтинг книги
В лапах зверя

Кенди

Неизвестен 3 Автор
Детские:
прочая детская литература
5.00
рейтинг книги
Кенди

Том 6. Рассказы, очерки. Железный поток

Серафимович Александр Серафимович
6. Собрание сочинений в семи томах
Проза:
советская классическая проза
5.00
рейтинг книги
Том 6. Рассказы, очерки. Железный поток

1001 заговор сибирской целительницы / Наталья Ивановна Степанова

Степанова Наталья Ивановна
Дом и Семья:
прочее домоводство
7.86
рейтинг книги
1001 заговор сибирской целительницы / Наталья Ивановна Степанова