UNIX — универсальная среда программирования
UNIX — универсальная среда программирования читать книгу онлайн
В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями
shell.
Для программистов-пользователей операционной системы UNIX.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
6.6 Об ошибках и отладке
Если вы писали программы ранее, вам знакомо понятие ошибки. Однако важно не только создавать программы, свободные от ошибок, но и заботиться о том, чтобы ваш проект был прост, тщательно реализован и сохранял свою "чистоту" в процессе модификации.
В UNIX много инструментов, которые помогут вам находить ошибки, хотя ни один из них не является действительно первоклассным. Для того чтобы продемонстрировать их, нам нужна ошибка; все же программы в этой книге совершенны. Поэтому мы "создадим" типичную ошибку. Рассмотрим приведенную выше функцию
pick
pick(s) /* offer choice of s */
char *s;
{
fprintf("%s? ", s);
if (ttyin() == 'y')
printf("%sn", s);
}
Что произойдет, если мы откомпилируем и запустим ее?
$ сс pick.с -о pick
$ pick *.с
Ошибка при обращении к памяти - сделан дамп
$
Сообщение "Ошибка при обращении к памяти" свидетельствует о том, что ваша программа пыталась работать с недозволенной областью памяти. Обычно в таком случае указатель содержит неправильное значение. "Ошибка адресации шины" другое диагностическое сообщение со сходным значением, часто обусловленное просмотром бесконечной строки. "Сделан дамп памяти" означает, что ядро сохранило состояние вашей выполняемой программы в файле
core
kill -3
Существуют две программы
adb
sdb
adb
sdb
Из-за ограниченного объема книги мы лишь частично покажем вам применение каждой программы, а именно распечатаем содержимое стека, т.е. выведем функцию, выполнявшуюся при аварийном завершении программы, функцию, которая ее вызывала, и т.д. Первая функция, указанная в распечатке стека, это то место, где находилась программа, когда она была аварийно завершена.
Чтобы получить распечатку стека с помощью
adb
$ adb pick core
$C
~_strout(0175722,011,0,011200)
adjust: 0
fillch: 060542
__doprnt(0177345,0176176,011200)
~fprintf(011200,0177345)
iop: 01120
fmt: 0177345
args: 0
~pick(0177345)
s: 0177345
~main(035,0177234)
argc: 035
argv: 0177234
i: 01
buf: 0
ctl-d
$
Здесь речь идет о том, что
main
pick
fprintf
__doprnt
_strout
__doprnt
pick.с
fprintf
$С
$С
adb
sdb
$ sdb pick core
Предупреждение: 'a.out не компилируется с -g
lseek: address 0xa64
*t
lseek()
fprintf(6154,2147479154)
pick(2147479154)
main(30,2147478988,2147479112)
*q
$
Информация размещена по-иному, но есть общая основа:
fprintf
fprintf
pick
fprintf("%s?", s);
Здесь нет
stderr
FILE
Мы показали вам типичную ошибку, которая является скорее результатом просмотра, а не неправильного программирования. Искать подобные ошибки при вызове функции с неверными аргументами можно также с помощью верифицирующей программы для Си
lint(1)
lint
pick.с
$ lint pick.с
...
fprintf, arg. 1 несовместим "llib-lc"(69) :: "pick.c"(28)
...
$
Это означает, что первый аргумент в стандартной библиотеке определен иначе, чем в строке 28 вашей программы. Таким образом дана точная информация о том, что неверно.