Авторские статьи Программирование. Отладка.

Discussion in 'Статьи' started by Renji, 22 Dec 2010.

  1. Renji

    Renji Member

    Joined:
    5 Dec 2010
    Messages:
    24
    Likes Received:
    5
    Reputations:
    0
    Программирование. Отладка.

    Отладка - важнейший шаг программирования. Программист, который не может с ней правильно обращаться - слеп. Основное значение слова "отладка", думаю для вас не секрет, это удаление ошибок. Если быть точнее, то это умение определять ошибки во время исполнения программы. В другом понимании отладка - это некий детективный процесс, который сам себя подозревает в наличии слабых мест. Но сначало обратим внимание на принцип создания надёжного кода:

    • Корректировать код во время его создания.
    • Стадия отладки кода.
    • Предусмотрение исключительных ситуаций.


    Для повышения надежности следует уменьшить изначальную сложность системы, и главное в этом процессе - это повторное использование. В идеале большая часть системы должна быть собрана из уже готовых компонентов. Нужно стараться создавать надежный код. Но без отладки пока обойтись невозможно. Роль тестеров в современном процессе разработки ПО велика. Идеалисты, которые думают, что дизайн, анализ или что-то иное более фундаментально никогда не станут хорошими программистами. Большая часть существующего кода является несовершенным. Не имея возможности добиться прозрачности в исполнении кода может повлечь за собой сокрушительный удар. Чаще всего прозрачность добивается только экспериментальным путем, тоесть средствами отладки. Отладка может доказать некорректность программы, но она не может доказать ее правильность. За правильность программы отвечает, конечно же сам программист.

    Часть ошибок программы ловится автоматически еще на этапе компиляции. Сюда относятся все синтаксические ошибки, ошибки несоответствия типов и некоторые другие. Но это далеко не все опасности, которые вас могут поджидать. Вы должны наблюдать за ходом выполнения программы. Иногда выводы можно сделать исходя из того, что отображается на экране. Во многих случаях, речь идёт о вещах, наблюдать за которыми программист не может (например состояние некоторых переменных, или результаты выполнения через сложные структуры). Всё это должно быть выявлено. Из классификации способов "заглянуть" в мир выполнения программы:

    • Использование средств отладки.
    • Внесение временных изминений в код программы.
    • Создание выходного потока (OUT) с ведением лога работы программы.

    Внесение изминений и создание потока не менее важны, чем инструмент отладки. Средство отладки зачастую отстаёт в развитии от самого языка, поэтому ложить весь груз на неё не рекомендуется. Поэтому правильным решением будет использовать все 3 метода. Создание выходного потока называется отладочной печатью. Она позволяет получить данные о ходе и состоянии процесса вычислений.
    Некоторые новички испытывают некий страх, когда отладка требует внесения изминений в код. Это понятно - похоже, немного, на способ слепой хирургии. Но вы должны научиться эксперементировать на коде. Если вы не можете перебороть страх, или у вас не получается - рекомендую найти наставника. Многие хорошие программисты не становятся таковыми именно на этой стадии.
    Пусть, например, вы создали программу, которая должна выполнить десять каманд в последовательности. Когда вы запустите её, она выходит из строя. Поскольку это небыло вашей задачей, можно с уверенностью сказать, что это крах программы. Если вы посмотрите на вывод, то увидите, что 7 итераций закончились успешно. Вывод последних трех не виден. Так что решать проблему уже намного легче.
    Можно ли посмотреть ещё глубже? Конечно. Мы внесём изминения в итерации 8, 9 и 10. При слкдующем запуске узнаем, что "больная итерация" имеет номер 9. Всё сводится к тому, что отладка имеет целенаправленный характер. Для новичков каждая строка кода выглядит как та, которая содержит ошибку. С приобретением опыта вы научитесь довольно быстро находить слабые места вашего творчества.
    Зачастую трудность поиска ошибки сопроваждается трудностью её исправления. Даже я исправлю себя. Трудность исправления ошибки зачастую сопровождается отсутствием пояснений к коду. Признайтесь, ни у кого из нас нет идеального мышления, так что метки программы придётся ставить. Иначе, по прошествии нескольких дней и обнаружении старой ошибки вам будет очень сложно понять код.
    Иногда несколько ошибок выглядят как одна единая. В этом случае вам поможет только ваш опыт. Сначало вы должны прокомментировать код, потом внести изминения, в соответствиями с вашим комментарием. Существует множество методик поиска и устранения багов. Они могут существенно отличаться для разных программ разного назначения.
    Признаком возможности окончания отладки является полнота охвата пропущенными через программу тестами, и относительно редкое проявление ошибок в проверяемой программе на последнем отрезке процесса тестирования.

    И несколько советов:
    • Если текущая стратегия поиска не приводит к положительному результату - это повод, чтобы остановиться и придумать другую. Ведь очевидно, что если раз за разом делать одно и то же, то и результат будет тем же. =)
    • Если ошибка воспроизводится нестабильно, тому может быть несколько причин. Наиболее распространенные ошибки - работа с памятью и неправильная синхронизация нескольких потоков.
    • Перед тем, как исправлять ошибку, целесообразно на время остановиться и понять причину ее возникновения.
    • Перед тем, как вносить изменения в код, надо разобраться в том, как он работает.
    • Бывает полезно исправлять ошибки через выполнение Рефакторинга.
    • Чаще останавливайтесь и обдумывайте свои действия.
    • Построение эффективной стратегии достижения результата намного продуктивней, чем оптимизация процесса.

    Ссылки по теме (для изучения рекомендую все):
    http://msdn.microsoft.com/ru-ru/library/8x5x43k7.aspx
    http://www.network-theory.co.uk/docs/gccintro/gccintro_94.html
    http://icecube.wisc.edu/~dglo/gcc-warnings.html
    http://www.drpaulcarter.com/cs/common-c-errors.php