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

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

Жанры

Программирование для Linux. Профессиональный подход

Самьюэл Алекс

Шрифт:

g++ -g -о reciprocal main.o reciprocal.o

Встречая в командной строке флаг

– g
, компилятор включает дополнительную информацию в объектные и исполняемые файлы. Благодаря этой информации отладчик узнает, какие адреса соответствуют тем или иным строкам в том или ином исходном файле, как отобразить значение локальной переменной, и т.д.

1.4.2. Запуск отладчика

Отладчик

gdb
запускается следующим образом:

% gdb reciprocal

После запуска появится строка приглашения такого вида:

(gdb)

В первую очередь необходимо запустить программу под отладчиком. Для этого введите команду

run
и требуемые аргументы. Попробуем вызвать программу без аргументов:

(gdb) run

Starting program: reciprocal

Program received signal SIGSEGV, Segmentation fault.

__strtol_internal (nptr=0x0, endptr=0x0, base=10, group=0)

at strtol.c:287

287 strtol.c: No such file or directory.

(gdb)

Проблема заключается в том, что в функции

main
не предусмотрены средства контроля ошибок. Программа ожидает наличия аргумента, а в данном случае его нет. Получение сигнала
SIGSEGV
означает крах программы. Отладчик определяет, что причина краха находится в функции
__strtol_internal
. Эта функция является частью стандартной библиотеки, но ее исходный файл отсутствует. Вот почему появляется сообщение "No such file or directory". С помощью команды
where
можно просмотреть содержимое стека:

(gdb) where

#0 __strtol_internal (nptr=0x0, endptr=0x0, base=10, group=0)

at strtol.c:287

#1 0x40096fb6 in atoi (nptr=0x0) at ../stdlib/stdlib.h:251

#2 0x804863e in main (argc=1, argv=0xbffff5e4) at main.c:8

Как нетрудно заметить, функция

main
вызвала функцию
atoi
, передав ей нулевой указатель, что и стало причиной ошибки.

С помощью команды

up
можно подняться но стеку на два уровня, дойдя до функции
main
:

(gdb) up 2

#2 0x804863е in main (argc=1, argv=0xbffff5e4) at main.c:8

8 i = atoi(argv[1]);

Заметьте, что отладчик нашел исходный файл

main.c
и отобразил строку, где располагается ошибочный вызов функции. Узнать значение нужной локальной переменной позволяет команда
print
:

(gdb) print argv[1]

$2 = 0x0

Это подтверждает нашу догадку о том, что причина ошибки — передача функции

atoi
указателя
NULL
.

Установка контрольной точки осуществляется посредством команды

break
:

(gdb) break main

Breakpoint 1 at 0x804862e: file main.c, line 8.

В данном случае контрольная точка размещена в первой строке функции

main
. Давайте теперь заново запустим программу, передав ей один аргумент:

(gdb) run 7

Starting program: reciprocal 7

Breakpoint 1, main (argc=2, argv=0xbffff5e4) at main.c:8

8 i = atoi(argv[1]);

Как видите, отладчик остановился на контрольной точке- Перейти на следующую строку можно с помощью команды

next
:

(gdb) next

9 printf("The reciprocal of %d is %g\n", i,

reciprocal(i));

Если требуется узнать, что происходит внутри функции

reciprocal
, воспользуйтесь командой
step
:

(gdb) step

reciprocal (i=7) at reciprocal.cpp:6

6 assert(i != 0);

Иногда удобнее запускать отладчик

gdb
непосредственно из редактора Emacs, а не из командной строки. Для этого следует ввести в редакторе команду
M-x gdb
. Когда отладчик останавливается в контрольной точке, редактор Emacs автоматически открывает соответствующий исходный файл. Не правда ли. проще разобраться в происходящем, глядя на весь файл, а не на одну его строку?

1.5. Поиск дополнительной информации

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

Ниже описаны наиболее полезные источники информации о программировании в Linux.

1.5.1. Интерактивная документация

В дистрибутивы Linux входят

man
– страницы с описанием большинства стандартных команд, системных вызовов и стандартных библиотечных функций. Интерактивная документация разбита на разделы, которым присвоены номера. Для программистов наиболее важными являются следующие разделы:

(1) пользовательские команды;

(2) системные вызовы:

(3) стандартные библиотечные функции:

(8) системные/административные команды.

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

Чужак

Листратов Валерий
1. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Чужак

Артефактор. Шаг в неизвестность

Седых Александр Иванович
1. Артефактор
Фантастика:
фэнтези
боевая фантастика
попаданцы
6.12
рейтинг книги
Артефактор. Шаг в неизвестность

Врубель

Коган Дора Зиновьевна
Жизнь в искусстве
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Врубель

Недотепа

Лукьяненко Сергей Васильевич
Фантастика:
фэнтези
5.80
рейтинг книги
Недотепа

Кодекс Крови. Книга V

Борзых М.
5. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга V

Твое сердце будет разбито. Книга 1

Джейн Анна
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Твое сердце будет разбито. Книга 1

Память льда

Эриксон Стивен
3. «Малазанская империя»
Фантастика:
фэнтези
6.00
рейтинг книги
Память льда

Проданная Истинная. Месть по-драконьи

Белова Екатерина
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Проданная Истинная. Месть по-драконьи

Гром Раскатного. Том 3

Володин Григорий Григорьевич
3. Штормовой Предел
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Гром Раскатного. Том 3

Барон

Первухин Андрей Евгеньевич
5. Ученик
Фантастика:
фэнтези
5.60
рейтинг книги
Барон

Дважды одаренный. Том VI

Тарс Элиан
6. Дважды одаренный
Фантастика:
аниме
альтернативная история
фэнтези
фантастика: прочее
5.00
рейтинг книги
Дважды одаренный. Том VI

Т. 03 Гражданин Галактики

Хайнлайн Роберт Энсон
3. Отцы-основатели. Весь Хайнлайн
Фантастика:
научная фантастика
7.00
рейтинг книги
Т. 03 Гражданин Галактики

Третий

INDIGO
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий

Клан

Русич Антон
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Клан