Тому есть несколько причин, некоторые — вполне объективные, а другие основаны
на личном опыте. Часть менее распространенных языков программирования не
имеет отладчиков или обеспечивает лишь рудиментарные возможности отладки.
Отладчики системно-зависимы, так что вы можете оказаться в системе, в которой
нет привычного вам отладчика. Некоторые программы не очень хорошо поддаются
отладке: многопроцессные
или многонитевые программы, операционные системы,
распределенные системы зачастую должны отлаживаться более низкоуровневыми
средствами. В таких ситуациях вы можете полагаться только на себя, и немногие
вещи могут вам помочь: операторы выдачи сообщений на экран, личный опыт и
способность рассуждать, глядя на код.
Наш личный выбор — стараться не использовать отладчики, кроме как
для
просмотра стека вызовов или же значений пары переменных. Одна из причин этого
заключается в том, что очень легко потеряться в деталях сложных структур данных и
путей исполнения программы; мы считаем пошаговый проход по программе менее
продуктивным, чем усиленные размышления и код, проверяющий сам себя в
критических точках. Щелканье по операторам
занимает больше времени, чем
просмотр сообщений операторов отладочной выдачи, расставленных в критических
местах. Быстрее решить, куда поместить оператор отладочной выдачи, чем
проходить шаг за шагом критические участки кода, даже предполагая, что мы знаем,
где находятся такие участки. Более важно то, что отладочные операторы
сохраняются в программе, а сессии отладчика преходящи.
Слепое блуждание в отладчике, скорее всего, непродуктивно. Полезнее
использовать отладчик, чтобы выяснить состояние программы, в котором она
совершает ошибку, а затем подумать о том, как такая ошибка могла возникнуть.
Отладчики могут быть запутанными и сложными программами, особенно для
новичков, которым они принесут больше недоумения, чем помощи. Если задать
отладчику неправильный вопрос
, то он, скорее всего, даст вам ответ, и вы не
догадаетесь, куда этот ответ заведет вас.
Отладчик, однако же, может иметь невероятное значение, и вам обязательно надо
включить его в свой набор инструментов; скорее всего, отладчик — первое, к чему
вы прибегнете. Но даже если отладчика у вас нет или вы
застряли на особенно
сложной проблеме, все равно технические приемы, рассмотренные в этой главе,
позволят вам отлаживаться эффективно и быстро. Они также помогут увеличить
продуктивность использования отладчика, потому что в основном эти приемы
связаны с рассуждениями об ошибках и вероятных причинах их появления.
Хорошие подсказки, простые ошибки
Ой! Что-то случилось. Моя программа "свалилась", напечатала какой-то мусор или,
кажется, "зависла". Что мне делать?
Начинающие обычно винят в происшедшем компилятор, библиотеку или еще что-
нибудь, но только не свой код. Опытные программисты были бы счастливы сделать
то же самое, но они-то знают, что проблема, скорее всего, заключается
в их
собственной ошибке.
К счастью, в большинстве своем ошибки просты, и их можно обнаружить с помощью
простых приемов. Изучите улики — неверные результаты работы и попытайтесь
догадаться, как такие результаты могли возникнуть. Посмотрите на отладочную
выдачу перед аварийным завершением; если возможно, получите у отладчика стек
вызовов. Теперь вы уже кое-
что знаете о том, что именно произошло и где.