UNIX — универсальная среда программирования
UNIX — универсальная среда программирования читать книгу онлайн
В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями
shell.
Для программистов-пользователей операционной системы UNIX.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
6.6 Об ошибках и отладке
Если вы писали программы ранее, вам знакомо понятие ошибки. Однако важно не только создавать программы, свободные от ошибок, но и заботиться о том, чтобы ваш проект был прост, тщательно реализован и сохранял свою "чистоту" в процессе модификации.
В UNIX много инструментов, которые помогут вам находить ошибки, хотя ни один из них не является действительно первоклассным. Для того чтобы продемонстрировать их, нам нужна ошибка; все же программы в этой книге совершенны. Поэтому мы "создадим" типичную ошибку. Рассмотрим приведенную выше функцию
pickpick(s) /* offer choice of s */ char *s;{ fprintf("%s? ", s); if (ttyin() == 'y') printf("%sn", s);}Что произойдет, если мы откомпилируем и запустим ее?
$ сс pick.с -о pick$ pick *.с Ошибка при обращении к памяти - сделан дамп $Сообщение "Ошибка при обращении к памяти" свидетельствует о том, что ваша программа пыталась работать с недозволенной областью памяти. Обычно в таком случае указатель содержит неправильное значение. "Ошибка адресации шины" другое диагностическое сообщение со сходным значением, часто обусловленное просмотром бесконечной строки. "Сделан дамп памяти" означает, что ядро сохранило состояние вашей выполняемой программы в файле
corekill -3Существуют две программы
adbsdbadbsdbИз-за ограниченного объема книги мы лишь частично покажем вам применение каждой программы, а именно распечатаем содержимое стека, т.е. выведем функцию, выполнявшуюся при аварийном завершении программы, функцию, которая ее вызывала, и т.д. Первая функция, указанная в распечатке стека, это то место, где находилась программа, когда она была аварийно завершена.
Чтобы получить распечатку стека с помощью
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: 0ctl-d $Здесь речь идет о том, что
mainpickfprintf__doprnt_strout__doprntpick.сfprintf$С$Сadbsdb$ sdb pick coreПредупреждение: 'a.out не компилируется с -glseek: address 0xa64 *t lseek()fprintf(6154,2147479154)pick(2147479154)main(30,2147478988,2147479112)*q $Информация размещена по-иному, но есть общая основа:
fprintffprintfpickfprintf("%s?", s);Здесь нет
stderrFILEМы показали вам типичную ошибку, которая является скорее результатом просмотра, а не неправильного программирования. Искать подобные ошибки при вызове функции с неверными аргументами можно также с помощью верифицирующей программы для Си
lint(1)lintpick.с$ lint pick.с...fprintf, arg. 1 несовместим "llib-lc"(69) :: "pick.c"(28)...$Это означает, что первый аргумент в стандартной библиотеке определен иначе, чем в строке 28 вашей программы. Таким образом дана точная информация о том, что неверно.
