Как выполнить программу по шагам
Выполнение по шагам
Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.
Если теперь запустить программу, то произойдет остановка, и управление будет передано в среду Delphi, где строка с точкой останова помечается зеленой стрелкой. В заголовке главного окна Delphi появится информационное сообщение Projectl [Stopped] (Выполнение проекта Projectl приостановлено). При этом не забудьте установить флажок интегрированной отладки в разделе Debugger Options окна Options, иначе останова не произойдет!
Далее выполнение программы можно продолжить по шагам. Для этого используются команда Run=>Step Over (Запуск^ Перешагнуть), клавиша или кнопка Step Over (Перешагнуть). Если выполнить очередной шаг, то в редакторе подсвечивается синим цветом И помечается зеленой стрелкой следующий оператор, ожидающий выполнения.
Теперь чтобы проверить значение переменных, нужно навести на них указатель мыши, при этом появляется окно всплывающей подсказки со значениями переменных. Если навести указатель на переменную Arr, то в круглых скобках будет показан список всех значений массива, однако пока инициализация не закончена, значения, хранимые в массиве, непредсказуемы. После инициализации можно увидеть, что ячейки массива заполнены не полностью (рис. 9.6).
Рис. 9.5, Подготовка программы к пошаговой отладке
Рис. 9.6. Просмотр значений в момент отладки
Просмотреть список всех установленных точек останова можно с помощью команды View*Debug Windows1*Breakpoints (ПросмотриОкна отладки1* Точки останова).
Если программа остановлена, но при этом выполнялись какие-то действия по просмотру программы и текущее место останова было потеряно, вернуться к нему поможет команда Run=fShow Execution Point (Запуск* Показать точку выполнения),
Можно «входить внутрь» не только тех методов, которые написаны разработчиком, но и внутрь стандартных процедур Delphi. Для этого должен быть установлен флажок в поле Use Debug DCUs на вкладке Compiler окна Project Option.
Пошаговое выполнение программы. 136
Первое, что стоит сделать при поиске ошибки с помощью отладчика, — это выполнить программу в отладочном режиме. Попытка выполнить эту программу в отладочном режиме в Dev-C++ ( с помощью клавиши ) приводит к появлению диалогового окна с сообщением об ошибке «Ваша программа вызвала нарушение доступа». Этой информации слишком мало, чтобы разобраться, в чём проблема.
«Подобное сообщение об ошибке обычно говорит о некорректной работе с указателями того или иного типа.»
Команда Остановить выполнение заставляет отладчик заново начать работу с программой ( а не с того места, где вы находитесь ). Никогда не вредно перезагрузить отладчик перед началом работы.
Для того, чтобы увидеть, где именно таится проблема, выполните только часть программы. Отладчик позволяет сделать это посредством так называемых точек останова ( breakpoints ). Отладчик всякий раз прекращает выполнение программы при прохождении через точку останова, и передаёт управление программисту.
Теперь вы можете выбрать в меню команду Debug => Next Step ( Отладка => Следующий шаг ) либо нажать клавишу для выполнения одной строки программы.
Синяя подсветка перемещается к следующей выполнимой инструкции, пропуская два объявления переменных. ( Объявления не являются выполнимыми командами; они всего лишь выделяют память для объявляемых переменных. ) Такое выполнение одной инструкции С++ называется пошаговым выполнением программы. Вы можете переключиться в окно консоли программы и посмотреть, что именно вывела программа при выполнении этой инструкции ( рис. 10.3 ).
136 стр. Часть 2. Становимся функциональными программистами
Рис. 10.2. Точку останова легко опознать по маленькому красному кружку
Рис. 10.3. В любой момент вы можете переключиться на окно выполняемой программы
Выполнение двух последующих инструкций приводит нас к вызову функции StringEmUp( ).
Если опять выбрать команду Debug => Next Step ( Отладка => Следующий шаг ), программа аварийно завершится. Теперь мы знаем, что проблема кроется в этой функции.
«Если сбой происходит при вызове некоторой функции, то либо ошибка содержится в коде функции, либо ей передаются некорректные аргументы.»
137 стр. Глава 10. Отладка программ на С++
Команда Debugs => Next Step ( Отладка => Следующий шаг ) рассматривает вызов функции как единую команду. Однако на самом деле функция состоит из ряда отдельных инструкций С++, и для отладки нам надо пройти их пошагово. Такая функциональность обеспечивается командой Debug => Step Into ( Отладка => Шаг внутрь ).
Рис. 10.4. Установка точки останова на вызове функции stringEmUp( )
«Вы можете установить в программе столько точек останова, сколько вам требуется.»
Теперь перезапустите программу на выполнение, и она остановится на вызове функции StringEmUp( ).
Войдите в функцию, воспользовавшись командой Debug => Step into ( Отладка => Шаг внутрь ), как показано на рис. 10.5.
138 стр. Часть 2. Становимся функциональными программистами
Рис. 10.5. Команда Debug => Step Into ( Отладка => Шаг внутрь ) позволяет выполнить вызов функции пошагово
Рис. 10.6. Отладчик позволяет следить за значениями переменных
139 стр. Глава 10. Отладка программ на С++
Числа возле имён переменных в окне отладки — адреса, которые в данном случае малоинформативны. Строка szTarget пока что пуста, что вполне закономерно, так как мы ещё ничего в неё не скопировали. Значение строки szString1 также выглядит вполне корректно, но вот значение szString2 содержит сразу две строки — и «This is a string», и «THIS IS A STRING», чего вроде бы быть не должно.
Ответ находится в четвёртой переменной. Дело в том, что длина этих двух строк не 16 символов, а 17! Программа не выделила память для завершающего нуля, что и приводит к сбою при выполнении функции StringEmUp( ).
«Длина строки всегда включает завершающий нулевой символ.»
Давайте изменим программу, исправив ошибку. Пусть теперь С++ сам рассчитывает размер строк. Получившаяся в результате программа Concatenate2.срр, приведённая ниже, работает вполне корректно.
using namespace std ;
Как пользоваться отладчиком
Интегрированная интерактивная среда разработки программ Borland Pascal (IDE) включает в себя ряд средств, облегчающих разработку программ: автоматическое управление проектами, средств обеспечения модульной структуры программы, быструю компиляцию и простые в использовании оверлеи. Но, несмотря на все это, Ваша программа все равно может содержать ошибки, что не позволит ей корректно работать.
IDE для DOS Borland Pascal предоставляет вам инструментальные средства для отладки программ, то есть поиска и исправления ошибок. В этой статье описываются инструментальные средства и процедуры отладки программы в интегрированной среде Борланд Паскаль (большинство описанных возможностей применимо также к IDE FreePascal-я).
Ошибки этапа компиляции или синтаксические ошибки происходят, когда исходный код программы нарушает правила синтаксиса Паскаля. Компилятор не может скомпилировать программу, пока она не будет содержать только допустимые операторы Паскаля. Когда компилятор встречает оператор, который он не может распознать, соответствующий файл выводится в окне редактирования, курсор устанавливается на то место, которое не понял компилятор, и выводится сообщение об ошибке.
Наиболее общей причиной ошибок этапа компиляции являются ошибки набора (опечатки), пропущенные точки с запятой, ссылки на неописанные переменные, передача неверного числа (или типа) параметров процедуры или функции и присваивание переменной значения неверного типа.
Ошибки этапа выполнения или семантические ошибки происходят, когда вы запускаете успешно откомпилированную программу, которая при выполнении делает что-то недопустимое. То есть, программа содержит допустимые операторы Паскаля, но при выполнении этих операторов что-то происходит неверно. Например, программа может пытаться открыть для ввода несуществующий файл или выполнить деление на ноль.
Когда такая ошибка обнаруживается, выполнение программы завершается, и выводится сообщение следующего вида:
Run-time error ## at seg:ofs
Логические ошибки приводят к некорректному или непредвиденному изменению значений переменных, неправильному отображению графики или невыполнению кода тогда, когда это ожидается. В остальной части этой статьи обсуждаются методы отслеживания логических ошибок.
Иногда, когда программа делает что-то непредвиденное, причина достаточно очевидна, и Вы можете быстро исправить код программы. Но другие ошибки более трудноуловимы и вызываются в результате взаимодействия различных частей программы. В этих случаях лучше всего остановить вашу программу в заданной точке, пройти ее шаг за шагом и просмотреть состояние переменных и выражений.
Как пользоваться random?
если массив целочисленный
Как быстро научится пользоваться паскалем
Всем доброго времени суток! Подскажите пажалуйста как быстро выучить паскаль есле вообще.
Как пользоваться отладчиком?
Дайте ссылку на хороший материал или литературу
Как пользоваться отладчиком?
Вот код. В книжке написано: «поставьте точку останова Отладчика на оператор j=i и в цикле работы.
Основной смысл использования встроенного отладчика состоит в управляемом выполнении. Отслеживая выполнение каждой инструкции, Вы можете легко определить, какая часть Вашей программы вызывает проблемы. В отладчике предусмотрено пять основных механизмов управления выполнением программы, которые позволяют вам:
Само по себе выполнение программы по шагам может быть недостаточно полезным, разве что поможет найти то место, где что-то происходит совершенно неверно. Но управляемое выполнение дает Вам возможность проверять состояние программы и ее данных, например, отслеживать вывод программы и ее переменные.
Когда Вы отлаживаете программу, наименьшим выполняемым элементом является строка. Это означает, что Вы можете управлять отладкой до уровня отдельной строки исходного кода программы. Поэтому, если на одной строке программы содержится несколько операторов Паскаля, эти операторы не могут быть отлажены индивидуально. С другой стороны, с целью отладки оператор можно разбить на несколько строк, каждая из которых будет выполняться за один шаг.
Все выполнение в отладчике, включая выполнение по шагам, трассировку и останов, основывается на строках. Подсвечивая строку, встроенный отладчик всегда сообщает Вам, какую строку он выполнит на следующем шаге (строка выполнения). Строка выполнения выводится цветом, отличным от нормального цвета. Благодаря этому Вы можете легко видеть, где находитесь.
Возьмем, например, следующую программу:
Хотя функция Negate и вызывается 10 раз, строка выполнения никогда на нее не перемещается. Выполнение по шагам позволяет отладчику не показывать детали любых вызовов для отдельной строки. Выполнение по шагам вызывает выполнение всего цикла for сразу, поэтому Вы не сможете видеть изменения в ходе выполнения цикла. Если же Вы хотите видеть подробности выполнения цикла, внесите в пример следующее простое изменение:
Поскольку оператор Паскаля может занимать несколько строк, такая программа будет в точности эквивалентна предыдущей версии, и генерируемый код будет идентичен. Но поскольку оператор WriteLn теперь находится на отдельной строке, отладчик может интерпретировать его отдельно. Если теперь Вы будете нажимать клавишу F8, то увидите, что строка выполнения будет при выполнении цикла 10 раз возвращаться на WriteLn.
Трассировка программы во многом аналогична ее выполнению по шагам. Единственное исключение состоит в том, что когда встречается оператор вызова процедуры/функции, при трассировке эти процедуры и функции также выполняются по шагам, а при простом выполнении по шагам управление возвращается вам после завершения выполнения подпрограммы.
Формат программы влияет на поведение строки выполнения при трассировке, хотя и не в такой степени как при пошаговом выполнении. Если код сформатирован как в первоначальном варианте приведенного выше примера, то трассировка оператора for приводит к выполнению 10 раз функции Negate. Если вы разобьете оператор for на две строки, то трассировка оператора end функции возвращает строку выполнения: ту строку основной программы, которая будет выполняться следующей. Первые девять раз это снова будет вызов функции. В десятый раз строка выполнения перемещается на оператор end программы.
Трассировка или выполнение по шагам?
Пошаговое выполнение и трассировка выполняют одно и то же действие, кроме того случая, когда строка выполнения находится на строке вызова процедуры/функции, или когда выполняется оператор begin в начале программы или модуля, который использует другие модули.
Пошаговое выполнение и трассировка методов объектов
Если в программе используются объекты, отладчик ведет себя аналогично своему поведению в случае обычных процедур/функций. Пошаговое выполнение метода интерпретирует метод как один шаг, возвращая управление к отладчику после того как метод завершает выполнение. Трассировка метода загружает и выводит на экран код метода и трассирует его операторы.
Иногда, конечно, нежелательно выполнять по шагам всю программу только для того, чтобы добраться до того места, где возникает проблема. Отладчик дает Вам возможность выполнять сразу большой фрагмент программы до той точки, где вы хотите начать выполнение по шагам.
3.6 – Использование встроенного отладчика: пошаговое выполнение
В предыдущих уроках мы исследовали различные способы изменения вашего кода для облегчения отладки, включая печать диагностической информации или использование логгера. Эти простые методы предназначены для проверки состояния программы во время ее выполнения. Хотя они могут быть эффективными при правильном использовании, у них все же есть недостатки: они требуют изменения вашего кода, что требует времени и может привести к появлению новых ошибок, и они загромождают ваш код, затрудняя понимание существующего кода.
За методами, которые мы показывали до сих пор, стоит неустановленное предположение: как только мы запустим код, он будет работать до завершения (только с паузой для приема входных данных) без возможности вмешаться и проверить результаты программы в любой момент времени, какой мы захотим.
Однако что, если бы мы смогли убрать это предположение? К счастью, мы можем. Большинство современных IDE поставляются со встроенным инструментом, называемым отладчиком, который предназначен именно для этого.
Отладчик
Отладчик – это компьютерная программа, которая позволяет программисту контролировать выполнение программы и проверять ее состояние во время выполнения программы. Например, программист может использовать отладчик для выполнения программы построчно, по ходу проверяя значения переменных. Сравнивая фактические значения переменных с ожидаемыми или наблюдая за ходом выполнения кода, отладчик может существенно помочь в отслеживании семантических (логических) ошибок.
Возможности отладчика двойственные: способность точно контролировать выполнение программы и возможность просматривать (и при желании изменять) состояние программы.
Ранние отладчики, такие как gdb, были отдельными программами с интерфейсами командной строки, где программисту приходилось вводить загадочные команды, чтобы заставить их работать. Более поздние отладчики (такие как ранние версии Turbo Debugger от Borland) всё еще были автономными, но поставлялись со своими собственными «графическими» интерфейсами для облегчения работы с ними. Большинство современных IDE, доступных в наши дни, имеют встроенный отладчик, то есть отладчик использует тот же интерфейс, что и редактор кода, поэтому вы можете отлаживать программу, используя ту же среду, которую вы используете для написания кода (вместо того, чтобы переключаться между программами).
Практически все современные отладчики содержат один и тот же стандартный набор базовых функций, однако единообразия в том, как организованы меню для доступа к этим функциям, нет, и еще меньше единообразия в сочетаниях клавиш. Хотя в наших примерах будут использоваться скриншоты Microsoft Visual Studio (и мы расскажем, как делать всё в Code::Blocks), у вас не должно возникнуть проблем с выяснением того, как получить доступ к каждой обсуждаемой нами функции, независимо от того, в какой среде разработки вы находитесь, даже если вашу IDE, мы не рассматриваем явно.
Остаток этой главы будет посвящен изучению того, как использовать отладчик.
Совет
Не пренебрегайте изучением, как пользоваться отладчиком. По мере того, как ваши программы становятся более сложными, количество времени, которое вы тратите на обучение эффективному использованию встроенного отладчика, будет бледнеть по сравнению с количеством времени, которое вы сэкономите на поиске и устранении проблем.
Предупреждение
Прежде чем продолжить этот урок (и последующие уроки, связанные с использованием отладчика), убедитесь, что ваш проект скомпилирован, используя конфигурацию отладочной сборки (для получения дополнительной информации смотрите «0.9 – Настройка компилятора: конфигурации сборки»).
Если вместо этого вы компилируете свой проект, используя конфигурацию релиза, функциональные возможности отладчика могут работать некорректно (например, когда вы попытаетесь начать выполнять свою программу пошагово, он просто запустит программу).
Для пользователей Code::Blocks
Если вы используете Code::Blocks, ваш отладчик может быть настроен правильно, а может и нет. Давайте, проверим.
Сначала перейдите в меню Settings (Настройки) → Debugger (Отладчик). Затем откройте дерево отладчика GDB/CDB (GDB/CDB debugger) слева и выберите Default (По умолчанию). Должно открыться диалоговое окно, которое выглядит примерно так:
Рисунок 1 – Настройки отладчика в Code::Blocks
Для пользователей Code::Blocks
Были сообщения о том, что встроенный отладчик Code::Blocks (GDB) может иметь проблемы с распознаванием некоторых путей к файлам, содержащих пробелы или неанглийские символы. Если во время прохождения этих уроков отладчик у вас работает со сбоями, то это может быть причиной.
Пошаговое выполнение
Мы собираемся начать изучение отладчиков с изучения некоторых инструментов отладки, которые позволяют нам контролировать выполнение программы.
Пошаговое выполнение – это название набора связанных функций отладчика, которые позволяют нам выполнять (поэтапно) наш код инструкцию за инструкцией.
Есть несколько пошаговых команд, которые мы рассмотрим по очереди.
Шаг с заходом (step into)
Команда шаг с заходом (step into) выполняет следующую инструкцию в обычном пути выполнения программы, а затем приостанавливает выполнение программы, чтобы мы могли проверить состояние программы с помощью отладчика. Если выполняемый оператор содержит вызов функции, шаг с заходом заставляет программу перескакивать в начало вызываемой функции, где она приостанавливается.
Давайте посмотрим на очень простую программу:
Давайте отладим эту программу, используя команду шаг с заходом.
Сначала найдите и затем выполните команду отладки шаг с заходом один раз.
Для пользователей Visual Studio
Для пользователей Code::Blocks
Для других компиляторов
Если вы используете другую среду IDE, вы, вероятно, найдете команду step into в меню Debug (Отладка) или Run (Выполнить).
Когда ваша программа не запущена и вы выполняете первую команду отладки, вы можете увидеть, что происходит несколько вещей:
Поскольку мы выполнили шаг с заходом, теперь вы должны увидеть какой-то маркер слева от открывающей скобки функции main (строка 9). В Visual Studio этот маркер представляет собой желтую стрелку (Code::Blocks использует желтый треугольник). Если вы используете другую IDE, вы должны увидеть что-то, служащее той же цели.
Рисунок 2 – Маркер строки, которая будет выполнена следующей, в Visual Studio
Этот маркер стрелки указывает, что указанная строка будет выполнена следующей. В этом случае отладчик сообщает нам, что следующая выполняемая строка – это открывающая скобка функции main (строка 9).
Выполните шаг с заходом (используя соответствующую команду для вашей IDE, как описано выше), чтобы выполнить открывающую скобку, и стрелка переместится к следующей инструкции (строка 10).
Рисунок 3 – Положение маркера после выполнения открывающей фигурной скобки
Рисунок 4 – Положение маркера после выполнения захода в функцию printValue
Рисунок 5 – Положение маркера после выполнения следующего шага с заходом
Выполните шаг с заходом снова, который выполнит инструкцию std::cout и переместит стрелку в строку 6.
Предупреждение
Если это произойдет, вы увидите, как ваша IDE откроет новый исходный файл, а стрелка-маркер переместится в начало функции с именем operator (это часть стандартной библиотеки). Закройте только что открытый исходный файл, затем найдите и выполните команду отладки шаг с выходом (step out) (если вам нужна помощь, инструкции приведены ниже в разделе «Шаг с выходом (step out)»).
Теперь, поскольку std::cout выполнено, теперь мы должны увидеть, что в окне консоли появилось значение 5.
Рисунок 6 – Положение маркера после завершения функции printValue
Выполните шаг с заходом еще три раза. На этом этапе мы выполнили все строки в нашей программе, поэтому мы закончили. Некоторые отладчики на этом этапе автоматически завершают сеанс отладки, некоторые – нет. Если ваш отладчик этого не делает, вам может потребоваться найти в меню команду Stop Debugging (остановить отладку) (в Visual Studio это находится в разделе Отладка (Debug) → Остановить отладку (Stop Debugging)).
Обратите внимание, что Остановить отладку для завершения сеанса отладки можно в любой момент процесса отладки.
Поздравляем, теперь вы пошагово выполнили программу и наблюдали за выполнением каждой строки!
Шаг с обходом (step over)
Как и шаг с заходом, команда шаг с обходом (step over) выполняет следующую инструкцию в обычном пути выполнения программы. Однако в то время как шаг с заходом будет входить в вызовы функций и выполнять их построчно, шаг с обходом выполнит всю функцию без остановки и вернет вам управление после выполнения этой функции.
Для пользователей Visual Studio
Для пользователей Code::Blocks
Давайте посмотрим на пример, в котором мы делаем шаг с обходом вызова функции printValue :
Сначала используйте команду шаг с заходом, пока маркер выполнения не окажется в строке 10:
Рисунок 7 – Положение маркера перед выполнением функции printValue
Теперь выполните шаг с обходом. Отладчик выполнит функцию (которая выводит значение 5 в окно консоли), а затем вернет управление вам в следующей инструкции (строка 12).
Команда шаг с обходом предоставляет удобный способ пропустить функции, если вы уверены, что они уже работают, или не заинтересованы в их отладке прямо сейчас.
Шаг с выходом (step out)
В отличие от двух других пошаговых команд, шаг с выходом (step out) не просто выполняет следующую строку кода. Вместо этого он выполняет весь оставшийся код функции, которая выполняется в настоящее время, а затем возвращает управление вам, когда будет выполнен возврат из функции.
Для пользователей Visual Studio
Для пользователей Code::Blocks
Давайте посмотрим на пример этого, используя ту же программу, что и выше:
Выполните команды шаг с заходом, пока не окажетесь внутри функции printValue с маркером выполнения в строке 4.
Рисунок 8 – Положение маркера в начале выполнения функции printValue
Затем выполните шаг с выходом. Вы заметите, что в окне вывода появится значение 5, и отладчик вернет вам управление после завершения функции (в строке 10).
Рисунок 9 – Положение маркера после выполнения шага с выходом в функции printValue
Эта команда наиболее полезна, когда вы случайно вошли в функцию, которую не хотите отлаживать.
Шагнули слишком далеко
При пошаговом выполнении программы вы обычно можете шагать только вперед. Очень легко случайно перешагнуть то место, которое вы хотели исследовать.
Если вы перешагнете намеченное место назначения, обычное дело – остановить отладку и снова ее перезапустить, соблюдая осторожность, чтобы на этот раз не пройти мимо цели.
Шаг назад
Некоторые отладчики (такие как Visual Studio Enterprise Edition и GDB 7.0) представили возможность пошагового выполнения, обычно называемую шагом назад или обратной отладкой. Цель шага назад – отмотать последний шаг назад, чтобы вы могли вернуть программу в предыдущее состояние. Это может быть полезно, если вы перешагнули цель, или если вы хотите повторно проверить только что выполненную инструкцию.
Реализация шага назад требует большой сложности со стороны отладчика (потому что он должен отслеживать отдельное состояние программы для каждого шага). Из-за сложности эта возможность еще не стандартизирована и зависит от отладчика. На момент написания (январь 2019 г.) ни Visual Studio Community Edition, ни последняя версия Code::Blocks не поддерживают эту возможность. Надеюсь, что в какой-то момент в будущем она попадет в эти продукты и станет доступной для более широкого использования.