Глава 22 Отладка, трассировка и оптимизация программ
Глава 22
Отладка, трассировка и оптимизация программ
22.1. Ошибки и отладка
Самыми страшными являются не синтаксические, а так называемые логические ошибки. Ваша программа может содержать хоть сотню мелких синтаксических ошибок — там не так функцию написали, там забыли указать параметр, а где-то пропустили точку с запятой. После исправления всех этих ошибок программа будет работать.
Если же ваша программа содержит логическую ошибку — например, вы выбрали неправильный алгоритм или неправильно его использовали, — то компилятор может даже не выдать предупреждения. Вроде бы ошибок нет, программа работает, но результат выдает неправильный или в какой-то момент вообще рушится. Мне запомнился один афоризм: «Программа делает то, что вы ей сказали, но не то, что вам хочется». Это и есть самое удачное, на мой взгляд, описание логической ошибки.
Если вы заметили ошибку до того, как ваша программа «увидела свет», то можете считать, что вам повезло. Одно дело, когда программа бесплатная, другое, когда вы за нее получили деньги, а заказчик недоволен... А бывает и такое, что программа может работать один, два месяца и только потом ваша логическая ошибка «всплывает» наружу. Почему это произошло? Дать однозначный ответ сложно, даже когда видишь код программы: все зависит от ее специфики.
Например, если ваша программа использует какую-нибудь СУБД для обработки информации, вы могли установить размер поля меньший, чем нужно. Первые два месяца программа работала отлично, а в один прекрасный момент оператор ввел очень длинную фамилию очень важного клиента, и ваша программа не внесла эту информацию в базу. Но это тривиальная ошибка, и ее можно исправить очень быстро.
А вот когда вы пишете программу для управления устройством или для обработки показаний внешних датчиков, подключенных к компьютеру, бывает очень сложно найти ошибку, связанную с конфликтом на аппаратном уровне. Например, пользователь установил новое устройство, которое конфликтует с вашим контроллером. Или вы написали модуль для поддержки одного контроллера, а пользователь подключил два, и оба теперь не работают.
Какие же ошибки часто совершают начинающие (и не только) программисты? Самая тривиальная — неправильное использование операций инкремента и декремента. Например, следующие выражения не эквивалентны:
x = y++ + 10;
x = ++y + 10;
В первом случае переменной x будет присвоено значение 15, а во втором — 16.
Следующей по частоте является ошибка неучтенной единицы. Например, вам нужен массив, состоящий из 10 элементов, вы его объявляете:
int а[10];
А затем инициализируете его с помощью цикла:
for (i=0;i<=10;i++) a[i] = 0;
Этот фрагмент кода попытается инициализировать несуществующий элемент — а[10].
Или еще один распространенный случай: программист забывает, что нумерация элементов массива начинается с 0, и не инициализирует первый элемент массива:
for (i=1;i<10;i++) a[i] = 0;
Особое место в зоопарке ошибок занимают ошибки, связанные с неправильным использованием указателей. Все эти ошибки можно условно разделить на три группы, которые я сейчас кратко перечислю.
1) Неправильное использование операторов * и &. Это самая распространенная группа ошибок начинающих программистов. Вот характерный пример такой ошибки:
/* неправильно */
char *s;
*s = (char *s)malloc(25);
/* правильно */
char *s;
s = (char *s)malloc(25);
2) Выделение недостаточного для адресации объекта объема памяти. Например, мы получим такую ошибку, если попытаемся скопировать в строку s (вышеприведенный фрагмент кода) строку, состоящую из 30 символов,
3) Использование неинициализированных указателей. Такие ошибки часто встречаются при работе с динамическими структурами. Например, с линейными списками: вы забыли инициализировать главный элемент (head = NULL) и пытаетесь добавить в список новый элемент.
Использование рекурсивных вызовов может повлечь за собой ошибку переполнения стека, если вы неправильно зададите условие завершения рекурсии. Как правило, рекурсивная функция вызывает саму себя с несколько измененными параметрами. Рано или поздно такая функция должна, в зависимости от переданных параметров, возвратить какое-нибудь значение, а не опять вызвать саму себя.
Для облегчения поиска ошибок были созданы специальные программы — отладчики. Одним из самых удачных отладчиков для Linux является gdb (The GNU Debugger). Этот отладчик входит в состав всех распространенных дистрибутивов (за исключением их «урезанных» версий — для рабочих станций), и для его установки достаточно установить пакет gdb.
С помощью gdb вы сможете:
? запустить вашу программу с определенными аргументами;
? запустить программу в пошаговом режиме;
? установить точки останова (breakpoint);
? установить условие останова программы;
? узнать, что случилось, если программа неожиданно завершилась.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Глава 15 Отладка
Глава 15 Отладка Имеется множество правил, начиная с логики программы и расположения данных, через организацию и расположение кода и кончая реализацией, которые могут минимизировать ошибки и проблемы. Мы рекомендуем вам изучить их; найдите хорошие книги по
Глава 18 Отладка
Глава 18 Отладка Один из самых существенных факторов, который отличает разработку ядра от разработки пользовательских приложений, — это сложность отладки. Отлаживать код ядра сложно, но крайней мере по сравнению с кодом пространства пользователя. Еще больше усугубляет
Глава 6. CSS оптимизация
Глава 6. CSS оптимизация 6.1. Оптимизируем CSS expressions CSS-производительность не находится сейчас в фокусе внимания при разработке клиентских приложений для браузера. Очень часто о некоторых ключевых моментах просто не знают (или забывают), и это может привести к появлению
Глава 7. Оптимизация JavaScript
Глава 7. Оптимизация JavaScript 7.1. Кроссбраузерный window.onload Отложенная загрузка скриптов волнует общественность уже давно, почти 10 лет, — атрибут defer, призванный ее обеспечить, был добавлен в спецификацию еще в прошлом столетии. Однако проблема так и остается
22.5. Оптимизация программ. Профайлер gprof
22.5. Оптимизация программ. Профайлер gprof Ваша программа работает медленно? Скорее всего, причина кроется в неэффективном, медленном алгоритме. Существуют программы, позволяющие определить время работы каждой функции вашей программы и всей программы в целом. Программы
Глава 7 Оптимизация Windows
Глава 7 Оптимизация Windows В данной главе речь пойдет о параметрах реестра, с помощью которых можно повысить скорость или качество работы различных компонентов Windows XP, например таких, как сетевое соединение и стеки протоколов, а также скорость самой операционной системы.
Глава 5 Оптимизация
Глава 5 Оптимизация …ты скажи ему, что во всякой вещи надо соблюдать меру… Уильям Шекспир. Много шума из ничего «Любая задача выполнима, если она поддается измерению». Давайте поверим в данное утверждение и постараемся правильно выбрать показатели, которые будем
ГЛАВА 8. ОТЛАДКА ПРОЛОГ-ПРОГРАММ
ГЛАВА 8. ОТЛАДКА ПРОЛОГ-ПРОГРАММ На приведенных выше примерах вы уже приобрели опыт применения программ и научились их изменять, а также успели написать и свои собственные программы. Теперь самое время заняться вопросом: что делать, когда программа ведет себя не так, как
Глава 9. "Бронированный" программный код: отладка и устранение ошибок.
Глава 9. "Бронированный" программный код: отладка и устранение ошибок. В этой главе ...~ Каталог всевозможных ошибок, стремящихся "одурачить" вашу программу~ Принципы борьбы с ошибками~ Замечательная возможность - режим паузы~ Все средства отладки редактора Visual Basic, включая
Глава 16. Тестирование и отладка
Глава 16. Тестирование и отладка Неполадки в блоке АЕ-35. В ближайшие семьдесят два часа блок может отказать. Артур Кларк, «Космическая Одиссея 2001 года» Тестирование — вещь важная. Все компетентные программисты об этом знают, хотя не всегда этот вопрос стоит для них на
2. Отладка и трассировка.
2. Отладка и трассировка. Ну это совсем банально. Выносим определение операторов за определение класса и ставим там точку останова. Чтобы не тормозило в релиз версии, окружаем слово inline ифдефами.template ‹class T›#ifndef DEBUGinline#endifSmartPointer‹T›::operator T*() { return tObj;}template ‹class T›#ifndef
Глава 6 Оптимизация
Глава 6 Оптимизация Если с увеличением объема вашей базы данных она стала работать слишком медленно, зачастую самый простой путь решения этой проблемы – увеличение мощности аппаратной платформы сервера. Однако повысить быстродействие системы можно и без наращивания
Глава 29. Отладка сценариев
Глава 29. Отладка сценариев Командная оболочка Bash не имеет своего отладчика, и не имеет даже каких либо отладочных команд или конструкций[ 59 ]. Синтаксические ошибки или опечатки часто вызывают сообщения об ошибках, которые которые практически никак не помогают при