[Закрыть]
 
popoff.donetsk.ua
Надменное извинение - ещё одно оскорбление.
Начало | Новости | Статьи | Форум | Опросы | Карта сайта | Обо мне
popoff.donetsk.ua - Статьи - Программирование - Технологии программирования - Отладка
Я это делаю
Персональное меню
Голосование
Деньги, либо любимое занятие? Постоянный адрес этого вопроса
Деньги, но неинтересная работа и невозможность уделить время семье
Интересная работа, возможность саморазвиваться, но нищенский заработок
Ваш возраст (не обязательно)
Почему? (не обязательно)

Голосование закрыто.

Поиск по сайту
Реклама
Обмен электронных валют
money.dn.ua
Статистика

Отладка

Постоянный адрес статьи

Из-за чего возникают ошибки в программах?

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

Или иногда сравнивают на точное равенство числа с плавающей точкой - чаще всего срабатывает правильно, но иногда может и проглючить. Почему - это вопрос второй (ответ на него Вы можете найти по ссылке в разделе «Смотрите также»). Как исправить - третий. Думаю, когда Вы поймёте, где ошибка и почему она возникает, на вопрос «Как исправить?» Вы и сами без труда найдёте ответ.

Вопрос самый важный, первый, на который Вам нужно найти ответ: «как узнать, что ошибка именно здесь?»

Для чего применяется отладка?

Вы написали программу, а она не работает. Как найти ошибку? Просто сидеть и смотреть на неё - дело бесполезное. Мест, в которых можно допустить мелочную ошибку - миллион. Даже если Вы обратитесь к профессионалу, думаете, он окинет одним взглядом Вашу программу и сразу увидит все ошибки? Нет, дополнительный опыт даёт лишь незначительное повышение внимательности в опасных местах, потому что опытные люди обычно следят: «ага. Вот в этом месте я попутал присваивание со сравнением. Впредь буду обращать особое внимание на код, когда буду использовать сравнение.» Когда опытный человек будет писать новый код, он просто не допустит подобную ошибку, потому что он много раз её допускал. Хотя с лёгкостью может допустить эту, а тем более любую другую ошибку. И если опытный человек допустит ошибку в своей программе, то никакой опыт не поможет ему просто окинув программу взглядом, найти эту ошибку. Разве что только случайность может помочь.

Как раз для поиска ошибок в программе и применяется отладка.

Что такое отладка?

Под фразой «Отлаживать программу» обычно понимают пошаговое выполнение программы, анализ хода выполнения программы и анализ значений важных переменных на каждом шаге работы программы.

Это даёт Вам три важные возможности:

  1. Вы можете узнать, откуда куда происходят переходы в Вашей программе.

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

    Или Вы пришли к условному оператору, и ожидаете, что дальше будут выполняться операторы, расположенные по ветке «то». А в реальности обнаружили, что выполняются операторы, расположенные по ветке «иначе». Вот Вы и нашли несоответствие ожидаемого действительному - скорее всего, условие неправильное. Или значения переменных в условиях неправильное. Как узнать, что же всё-таки, здесь ошибка в условии или в неправильных значениях переменных?

  2. Используя отладку, Вы можете узнать значения всех переменных в любой точке программы.

    Например, Вы пришли к какому-нибудь условию, которое, как Вы ожидаете, должно быть истинным, а оно оказывается ложным. Посмотрев значения всех переменных, Вы можете определить, где ошибка - в предыдущих вычислениях, которые неправильно сформировали значения переменных, или в самом условии.

    Как это определить? Очень просто - нужно посмотреть значения переменных и сравнить их с теми значениями, которые Вы ожидали увидеть. Если все значения именно такие, как Вы ожидаете - значит ошибка в условии. Если значение неправильное, значит, очевидно, ошибка в предыдущих вычислениях - тех самых, которые формировали значение этой переменной. Можете посмотреть на ту формулу, по которой сформировалось значение этой переменной, а можете запустить отладку ещё раз, чтобы узнать, в чём ошибка, в самой формуле, или просто на вход формуле подаются неправильные данные.

  3. Вы можете узнать, какие значения являются правильными.

    Когда Вы пишите программу, Вы обычно можете себе примерно представить, что будет содержаться в используемых Вами переменных. Но запустив отладку и посмотрев реальные значения Вы можете быть удивлены, обнаружив, что значения там совсем другие, не такие, как Вы ожидали.

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

    Это, кстати, касается и случая, когда Вы сравниваете вещественные числа, не учитывая точность представления чисел. Посмотрев в отладчике, что числа, вроде как одинаковые, но сравнение срабатывает так, как будто они разные, Вы не задумались бы, что именно в сравнении содержится ошибка.

    Теперь, зная реальные значения переменных, Вам не нужно пытаться окинуть одним взглядом всю программу. Достаточно добавить тот код, который Вы забыли добавить, чтобы обработать это новое значение.

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

В чём состоит суть отладки программы?

В большинстве современных сред разработки есть специальные средства для отладки разрабатываемых программ. Эти средства позволяют выполнять программу пошагово, видеть откуда куда происходят переходы в программе и на каждом шаге смотреть значения нужных Вам переменных.

Обычно для этого есть специальные клавиши, такие как «выполнить программу до строчки, в которой сейчас находится курсор», «выполнить одну строчку программы», «выполнить одну строчку программы, но если внутри этой строки есть вызов функции, то перейти внутрь этой функции».

Обычно, если программа не запущена и Вы нажимаете одну из этих трёх клавиш, то программа запускается и её выполнение приостанавливается на первой строчке.

Некоторые, кстати, забывают о клавише «выполнить программу до строчки, в которой сейчас находится курсор», думая, что это какая-то лишняя клавиша. Когда им нужно пройти цикл в 1000 шагов и посмотреть, что будет после цикла, они 1000 раз нажмут клавишу выполнения текущей строчки программы. Если, конечно, у них хватит терпения. Это делают обычно вместо того, чтобы один раз нажать более подходящую клавишу.

Большинство отладчиков включают в себя возможности для установки контрольных точек (точек останова). Когда выполнение программы дойдёт до контрольной точки, то она остановится и Вы сможете посмотреть значения переменных или пошагово выполнить её дальше.

Использовать контрольные точки удобно, например, если Вы программируете под Windows. Передача управления внутрь функций происходит по событиям Windows, таких функций много и Вы хотите узнать, какая же функция вызывается первой. В большинстве других случаев клавиши «выполнить до строчки, в которой сейчас находится курсор» должно быть достаточно.

Обратите внимание, что в большинстве отладчиков есть два режима запуска программы: 1) с возможностью отладки и 2) без возможности отладки. Если Вы запускаете программу без возможности отладки, то программа будет выполняться без остановки на точках останова. Обратите внимание, что для того, чтобы выполнить программу с текущей точки и до конца иногда следует нажимать не ту же клавишу, которую Вы нажимаете для того, чтобы выполнить программу с начала до конца.

Существуют среды, в которых нет встроенных отладчиков

Хотя такие среды встречаются относительно редко, они всё же бывают.

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

Как узнать, есть ли в используемой мной среде программирования встроенный отладчик?

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

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

Юрий Попов, popoff.donetsk.ua

Смотрите также

Что считать ошибкой?
http://popoff.donetsk.ua/text/work/prg/error.html

Отладка РНР-скриптов
http://phpfaq.ru/debug

Как читать документацию
http://phpclub.ru/faq/ReadManual
Несколько советов о том, как найти в документации то, что Вы хотите там найти

Неочевидные особенности вещественных чисел
http://www.delphikingdom.com/asp/viewitem.asp?catalogID=374

Последняя модификация: 01.11.07 09:27

Обсуждение статьи в форуме

Не проходите мимо! Оставьте Ваш комментарий в форуме! >>>

13.12.06 10:37 maniac

Под фразой «Отлаживать программу» обычно понимают пошаговое выполнение программы, анализ хода выполнения программы и анализ значений важных переменных всех на каждом шаге работы программы.


IMHO, данный процесс назвается трассировкой. Отладка - более широкое понятие, включает еще дополнительные операции.

13.12.06 12:20 popoff

В целом, согласен, что это ляп. На всякий случай залез в яндекс.словари:

Отладка программы - этап разработки компьютерной программы, в процессе которого происходят обнаружение, локализация и устранение явных ошибок в программе.

Обычно отладка выполняется на контрольных примерах с известными результатами.

slovari.yandex.ruотладка


Трассировка - отладочное выполнение программы, при котором на экран или на принтер выводятся аргументы и результаты выполнения каждой команды.

slovari.yandex.ruтрассировка

13.12.06 13:15 maniac

многие отладчики используются для reverse engineering (когда нет исходников)

Просмотреть все комментарии в режиме форума. Всего комментариев: 3
Не проходите мимо! Оставьте Ваш комментарий в форуме! >>>