Наличие двух этих возможностей совершенно обязательно. Например, у вас программа заканчивается аварийно и вы даже не можете теоретически предположить, где это происходит. Вы проходите программу без захода в функции. Соответственно выявите ту функцию, в которой происходит сбой. В следующий раз Вы зайдете внутрь ее и найдете функцию следующего уровня и так далее.
Итак, для начала выполнения программы по шагам без захода в функцию нужно использовать клавишу F10 или кнопку на панели инструментов отладки.
Нажимаем ее. Программа начнет выполняться, это вы сможете увидеть в строке задач Windows:
А в IDE вы увидите исходный код, в котором есть текущий курсор указатель команды.
Можно дальше нажимать F10 и следующая команда будет выполнена. В окне переменных Вы сможете просматривать значение текущих переменных, а те которые будут изменены подсвечиваются красным цветом.
Это окно не обязано быть на экране, если его не видно, то вызовите через меню View:
Если вы устанавливали исходные файлы (папка SRC), то увидите, что на этом выполнение программы не заканчивается и выполняется ряд дополнительных команд.
FLProg. Пошаговое выполнение программы с фиксированным временем шага.
Эти команды производят завершение работы программы. В любой момент вы можете остановить отлаживаемую программу вызвав пункт меню Stop debug:
Будьте осторожны с исходными файлами и не меняйте их.
Источник: firststeps.ru
Создание приложений в среде Borland C++ Builder
Как выполняются Windows-программы Отладочные команды Стратегия отладки Windows-программ Установка точек прерывания Отображение трассы выполнения Окончательное тестирование Некоторые рекомендации Занятие третье Продолжение. Начало см. в # 10 , 11/97 . Этим занятием мы завершаем наш учебный курс для пользователей системы Borland C++ Builder.
Занятие третье
Продолжение. Начало см. в # 10, 11/97.
Этим занятием мы завершаем наш учебный курс для пользователей системы Borland C++ Builder. Темой этого занятия станет отладка приложений. Мы рассмотрим технологию отладки событийно-управляемых приложений и возможности интегрированного отладчика C++ Builder.
Как выполняются Windows-программы
Чем отличается выполнение DOS-приложений от выполнения приложений, управляемых событиями, каковыми являются все приложения для Windows? Непредсказуемостью! Да-да, именно непредсказуемостью.
В DOS ваша программа выполнялась от инструкции к инструкции, периодически обращаясь за помощью к операционной системе: где буковку на дисплей вывести, где клавишу считать, где прерывание какое-нибудь вызвать. В Windows все иначе: ваше приложение запускает себя, создает окошко (а может быть, и не одно) и отдает себя в руки Windows, которая становится главным распорядителем.
С этого момента все команды, связанные с действиями пользователя, обрабатывает операционная система, и уже она решает, отдать или нет управление вашей программе. Это и является причиной непредсказуемости, называемой системными программистами асинхронностью. Ваше приложение просто не может знать, когда его «позовут к столу» и по какому поводу.
FLProg. Пошаговое выполнение с переключением по событию.
Возможно, пользователь выберет пункт из меню, а может быть, сработает системный таймер или передвинется мышь, кто ж его знает. Если событие все-таки возникает, Windows ищет в вашей программе соответствующий обработчик этого события (про обработчики мы уже с вами говорили на предыдущем занятии). Если таковой имеется, то управление передается ему.
Последний делает свое дело и возвращает управление Windows. Если управление не вернуть, то в окне менеджера задач напротив названия вашей программы возникнет строчка Not responding («Не отвечает»). Ну а дальше вы сами знаете, что с такими программами нужно делать.
Отладочные команды
Познакомимся с командами для отладки из меню Run. Их довольно много, хотя в режиме компиляции и редактирования многие отключены. Перечислим интересующие нас пункты меню и их назначение:
Run — запустить приложение на выполнение; Parameters — задать параметры командной строки для отлаживаемой программы; Step Over — пошаговое выполнение программы без захода внутрь вызываемых функций; Trace Into — пошаговое выполнение программы с заходом внутрь вызываемых функций; Trace To Next Source Line — выполнить шаг к следующей исполняемой строке исходного текста; Run To Cursor — выполнить программу до участка, где расположен курсор; Show Execution Point — установить курсор на участок выполнения; Program Pause — временно приостановить выполнение отлаживаемой программы; Program Reset — остановить выполнение программы, сбросить контекст выполнения задачи и освободить память; Evaluate/Modify — открыть диалоговую панель для вычисления выражений и модификации переменных и результатов вычисления выражений; Inspect — открыть диалоговую панель инспектора, где можно просмотреть значения переменных и выражений; Add Watch — открыть диалоговую панель просмотра данных и добавить в нее новые данные; Add Breakpoint — открыть диалоговую панель для установки и изменения точек прерывания.
Стратегия отладки Windows-программ
Отлаживая программу, программист обычно пользуется несколькими стандартными операциями:
Эти шаги одинаковы для отладки любых программ, выполняющихся на любых платформах. Однако техника их применения может несколько отличаться. Так, например, прогнозировать выполнение программы в DOS легко, а выполнение приложения в Windows может быть лишь смоделировано.
Из этого следует, что при отладке DOS-программу можно выполнять пошагово, перебираясь от одной строки исходного текста к другой. В Windows это нереально. Нужно поставить точку прерывания на интересующем вас участке программы и запустить ее на выполнение командой Run — Run. Достигнув точки прерывания, программа приостановит свое выполнение, давая возможность программисту приступить к отладочным действиям.
Установка точек прерывания
В приложениях, выполненных с применением C++ Builder, точки прерывания удобнее всего ставить внутри обработчиков событий. В файле проекта это делать бесполезно, потому что он сгенерирован автоматически, и вряд ли вам придется вносить туда изменения, что способно вызвать ошибки.
Простейший способ установить точку прерывания — нажать на клавишу . При этом выбранная для остановки строка выделяется красной полосой, на левом краю строчки появляется маленький значок «Stop».
Повторное нажатие на отменяет уже имеющуюся точку прерывания. Другой способ установить точку прерывания — щелкнуть мышью на левом краю окна редактирования. Результат будет таким же. Ну и наконец можно вызвать команду меню Run — Add Breakpoint.
Появится диалоговая панель редактирования точек прерывания Edit Breakpoint с несколькими полями, среди которых не только координаты файла и номера строки (где будет задана точка прерывания), но и некоторые другие полезные данные. К примеру, вы можете задать параметр Condition, где можно ввести выражение, при истинности которого точка прерывания сработает. Как показано на рис. 2, в строке 13 точка прерывания настроена так, чтобы сработать лишь в том случае, когда переменная Application не равна нулю. Иначе выполнение программы не будет прервано при прохождении через эту строку.
Дополнительно можно задать количество проходов, после которых точка прерывания переходит в активное состояние. Это весьма удобно при отладке длинных циклов, когда необходимо пропустить некоторое количество итераций.
Как правильно устанавливать точки прерывания? Это довольно сложный вопрос. Наверняка узнать правильное местоположение трудно, но есть два простых правила, которые помогут вам при отладке.
Попытайтесь определить место потенциальной ошибки. Это не всегда можно сделать, но попытаться надо. К примеру, вы нажимаете кнопку, а в ответ ничего не происходит или происходит не то, что вы ожидали. Ясно, что ошибка возникает либо в обработчике нажатия кнопки, либо в методах и функциях, которые из него вызываются. Отсюда следует, что установить точку прерывания нужно в начале данного обработчика.
Если не удается определить место потенциальной ошибки даже примерно, нужно поставить точки прерывания в начале каждого обработчика или, если их много, в группе из нескольких обработчиков. Затем воспроизведите ошибочную ситуацию и найдите, какая из точек прерывания сработает. Остальные можно снять за ненадобностью.
Когда ошибочный обработчик найден, нужно приступать к уточнению места ошибки. Для этого подумайте, что должно происходить в каждой строке программы в соответствии с логикой ее работы, и начинайте продвигаться шаг за шагом командой Trace Into (можно просто нажимать клавишу ) или Step Over (клавиша ), проверяя, как изменяются данные вашей программы.
Можно поступить и по-другому, поставив точку прерывания где-нибудь дальше в исходном тексте и вызвав команду Run (клавиша ). После остановки на точке прерывания проверяются данные вашей программы. Если они изменились не так, как это предполагалось, то, очевидно, ошибка находится на только что пройденном участке. Если же все в порядке, то идем дальше. При таком методе поиска нужно помнить, что если на пути встречаются операторы ветвления или перехода, то выполнение программы может пойти по непредсказуемому маршруту. Так что лучше все ветвления и переходы трассировать вручную командами Step Over и Trace Into.
Ошибки в программе могут быть самыми разнообразными. Но для Windows-приложений характерны следующие потенциальные «жучки»:
Отображение трассы выполнения
Во многих случаях обнаружить ошибку поможет трассировка содержимого переменных с помощью функции API OutputDebugString(), которая пересылает строку-аргумент в отладчик. В Borland C++ Builder все такие строки отображаются в отдельном окне редактора как содержимое файла OutDbgX.txt, где X — некий уникальный номер. Проанализируйте полученный поток сообщений и найдите ошибку, произошедшую по ходу выполнения. Можно выводить с помощью OutputDebugString() и значения переменных. Нужно только преобразовать их в строку. Ниже приводится фрагмент файла проекта с трассировочными сообщениями:
. try < Application->Initialize(); OutputDebugString(«Initialized. «); Application->CreateForm(__classid(TForm1), OutputDebugString( AnsiString( «Main form created » + IntToHex( int(Form1), 8) ).c_str() ); Application->Run(); OutputDebugString(«Finishing. «); > .
При прохождении каждого нового участка исходного текста отладчику посылается строка, говорящая о состоянии программы. А после создания главной формы выводится указатель на ее экземпляр.
Выглядит это сложновато, потому что нужно привести указатель к типу int, чтобы затем его преобразовать в строку шестнадцатеричного формата. Затем полученная строка типа AnsiString преобразуется вызовом метода c_str() к обычной цепочке байтов с нулем на конце. Можно упростить задачу и использовать функции sprintf wsprintf библиотеки языка Cи++.
Окончательное тестирование
Предположим, все ошибки найдены и устранены. Но червь сомнения все равно не дает покоя: а не осталось ли чего еще. Это значит, что вы подошли к этапу окончательного тестирования и вам предстоит изрядно повозиться. Первейшее средство для выявления скрытых ошибок — утилита Stress из комплекта разработчика Microsoft SDK.
Запустите через нее свою программу, задав «нечеловеческие» условия работы вроде нехватки оперативной памяти, подкачки на диск и т. д. Очень вероятно, что многие огрехи программирования мгновенно выплывут. Если же и в этом случае все в порядке, то следует поискать другой род ошибок: ошибки логические. На их поиске обычно седеют даже опытные разработчики.
Воспользуйтесь методом крайних элементов: отдельно взятую функцию программы вызывайте с различными аргументами. Сначала это нормальные допустимые логикой аргументы, затем минимальные аргументы, потом максимальные и, наконец, аргументы, выходящие за минимальный и максимальный допустимые пределы. Получаемый результат сравните с ожидаемым.
Если все нормально, функцию можно считать благополучной и переходить к следующей. Для экономии времени лучше всего начинать с функций верхнего уровня. Тогда при благоприятном исходе можно отсечь все подчиненные функции более низкого уровня.
Для удобства работы не поленитесь и напишите маленькую тестовую программу, которая сделает все необходимые вызовы функции с различными аргументами за один проход. Результат выведите с помощью функции OutputDebugString(). Такую программу достаточно будет запустить один раз и просмотреть полученную трассу выполнения.
Если же этот метод для вас неприемлем, то можно воспользоваться командой Run — Evaluate/ Modify. В появившейся диалоговой панели аргументы можно задавать вручную по ходу выполнения программы. В примере, показанном на рис. 3, потребовалось узнать, что произойдет, если изменить значение переменной Editor->SelStart.
Открыв диалоговую панель Evaluate/Modify, мы увидели, что первоначальное значение интересующей нас переменной равно нулю. Затем мы ввели значение 100 в поле New Value и нажали на кнопку Modify. Значение Editor->SelStart поменялось с 0 на 100. Это легко проверить командой Inspect (или нажав + ). Кстати, существует маленькая хитрость, позволяющая экономить время.
Вместо того чтобы вводить название проверяемой переменной, вы можете установить на нее курсор или выделить ее как текст, а уже после этого вызывать команды Run — Evaluate/ Modify или Run — Inspect. С++ Builder сам догадается, какую переменную вы собираетесь просмотреть, и предоставит вам информацию о ней.
И еще вариант: можно написать мини-программу, которая будет вызывать тестируемую функцию, передавая ей целую вереницу параметров и сводя результаты в таблицу. Такое средство может за считанные минуты перебрать миллионы различных комбинаций параметров, выдав такую обширную статистику, что ни одной ошибке просто не удастся ускользнуть.
Некоторые рекомендации
Эти маленькие советы касаются выбора ракурса просмотра данных или просто помогут вам сэкономить время:
И последнее: никогда не поздно попробовать запустить откомпилированное приложение без отладчика. Бывает, что вне последнего программа работает нормально.
Источник: www.osp.ru
Лабораторная работа №1, страница 2
Документ из архива «Лабораторная работа №1″, который расположен в категории » «. Всё это находится в предмете «основы программирования» из 1 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе «лабораторные работы», в предмете «основы программирования» в общих файлах.
Онлайн просмотр документа «Лабораторная работа №1»
Текст 2 страницы из документа «Лабораторная работа №1»
Если при компоновке многофайлового проекта посредством команды Build вы получаете сообщения об ошибках компиляции или сборки, которые вы не можете объяснить, то настоятельно рекомендуем вам воспользоваться командой Rebuild All. □ Start Debugging (F5)— выполнение исполняемого файла, созданного в результате компоновки проекта в режиме отладки. Рис. 1. Схема подготовки программы для исполнения в среде компилятора Откомпилируйте проект, щелкнув на кнопке Build (F7). Диагностические сообщения компилятора и компоновщика отображаются в окне вывода Output. Мы надеемся, что у вас все будет в порядке и последняя строка в окне вывода будет выглядеть так: First.exe — 0 error(s), 0 warning(s) Теперь запустите приложение на выполнение, щелкнув на зеленом треугольнике (Ctrl+F5). На приглашение ввести строку введите любую строку, например Hello, World!, и нажмите Enter. Мы не будем здесь разбираться, почему программа вывела «обрезанную» строку Hello, (проблема ввода-вывода строк будет частично рассмотрена ниже). Попробуйте заменить в программе оператор вывода cout 1.4.2. Проблемы с вводом-выводом кириллицы Работа в среде Visual C++ 2005 (в режиме консольных приложений) сопряжена с определенными неудобствами, вызванными различными стандартами кодировки символов кириллицы в операционных системах MS DOS и Windows. Напомним, что весь ввод-вывод в консольном окне идет в кодировке стандарта ASCII, а текст в исходных файлах, набираемый в текстовом редакторе Visual C++, имеет кодировку в стандарте ANSI. Символы кириллицы, в отличии от символов латинского алфавита, в этих стандартах имеют различную кодировку. Для устранения неудобств работы с кириллицей можно включить в программу оператор #include “ConsolCyr.h”, предварительно поместив файл ConsolCyr.h в папку, в которую помещается файл с исходным текстом программы (файл находится в папке с заданиями на выполнение ЛР, которые вы можете получить у преподавателя). Это позволит вам при выполнении лабораторных работ (но не во всех случаях) устранить проблемы, связанные с использованием кириллицы. Если в ЛР не требуется вводить с клавиатуры кириллицу (а только выводить символы кириллицы), то лучше вставить в начало функции main() оператор setlocale(0,”rus”), но при этом не использовать одновременно оба средства. //////////////////////////////////////////// #include //#include «ConsolCyr.h» using namespace std; int main()< //setlocale(0, «rus»); char str1[80]; cout > str1; // cout ////////////////////////////////////////////////////////// Ничего не принимайте на веру. Откомпилируйте эту программу и убедитесь, что она дает ожидаемый результат. Для того, чтобы можно было просмотреть результаты работы программы в окне DOS до его закрытия, удобно в конце программы перед оператором return вставить оператор system(«pause»). 1.5.Замечания по потоковому вводу-выводуВвод из буфера входного потока одного слова в символьный массивstr1. Предварительно весь текст нужно набрать на клавиатуре и нажать клавишу Enter, после чего весь текст поступит в буфер входного потока cin, а оттуда его можно пословно считывать с помощью перегруженной для входного потока операции >>(поразрядный сдвиг вправо) в переменную, стоящую справа от >>, в данном случае это символьный массив str1. Одна операция считывает одно слово. Если повторить операцию, то из буфера будет считано следующее слово. Если буфер пустой, то на экран выведется запрос на ввод данных в виде мерцающего курсора. Программа остановится и будет ожидать ввода данных с клавиатуры. Потоковый ввод-вывод автоматически выполняет форматирование данных в соответствии с типом переменной, стоящей справа от знака операции. Потоковый ввод-вывод будет рассматриваться подробно при изучении объектно-ориентированного программирования, а пока вам нужно запомнить синтаксис операторов потокового ввода–вывода, чтобы использовать его в разрабатываемых программах. Задание.
- С целью освоения потокового ввода-вывода измените программу так, чтобы она печатала введенную строку Привет, мир! полностью, используя для хранения введенного текста только один буфер (массив символов str1). В остальном вид экрана должен остаться прежним. Строка вводится с клавиатуры только один раз.
- Разработайте программу, которая вводит два целых числа и выводит их сумму.
1.6. Конфигурация проекта
Visual C++ позволяет строить проект либо в отладочной конфигурации (Win32 Debug), либо в выпускной конфигурации (Win32 Release). Мы рекомендуем вам всегда работать с проектами в отладочной конфигурации. Обычно она установлена по умолчанию. Все же не мешает проверить, с какой конфигурацией на самом деле идет работа. Для этого выберите в меню Project пункт Settings.
Откроется диалоговое окно Project Settings. Проверьте, какое значение установлено в окне комбинированного списка Settings For. Если это не Win32 Debug, то переключитесь на нужное значение через команду меню Build ► Set Active Configuration.
1.7. Как закончить работу над проектом
Можно выбрать меню File, пункт Close Solution. А можно просто закрыть приложение Visual C++.
1.8. Как открыть проект, над которым вы работали ранее
1. Способ первый:
- Запустите на выполнение Visual C++.
- Выберите меню File, пункт Open .
- В открывшемся диалоговом окне найдите папку с вашим проектом, а в ней — файл ProjectName.vcproj.
- Откройте этот файл, щелкнув по нему мышью.
2. Способ второй:
■ Запустите на выполнение Visual C++.
- Выберите меню File, наведите курсор мыши на пункт Recent Workspaces.
- Если в появившемся меню со списком последних файлов, с которыми шла
работа, вы найдете интересующий вас файл ProjectName.vcproj, то щелкните по
нему мышью.
3. Способ третий:
- Не вызывая Visual C++, найдите папку с вашим проектом, а в ней — файл
ProjectName.vcproj.
- Щелкните мышью на файле ProjectName.vcproj.
1.9. Встроенная справочная система
В IDE Visual С ++ имеется обширная справочная система, доступная через меню Help главного окна.
Кроме этого, очень удобно пользоваться интерактивной справкой: если вы находитесь в окне Editor, поставьте текстовый курсор на интересующий вас оператор или библиотечную функцию C++ и нажмите клавишу F1. Тотчас будет вызвана справочная система MSDN (если она установлена) с предоставлением необходимой информации. Если запрошенный термин встречается в разных разделах MSDN, то сначала появится диалоговое окно «Найденные разделы». В списке разделов выберите тот, в котором упоминается «Visual C++».
Задание.
Найдите в справочной системе информацию об операторе for. То, что она написана на английском языке, не должно вас останавливать.
Для программирования в среде Visual C++ Вам следует изучить английский на столько, чтобы понимать сообщения компилятора и тексты справочной системы! Поверьте, это не так уж сложно, так как число сообщений ограничено, а в справочной системе широко использованы копирование и вставка. Для ускорения работы установите на своем компьютере англо-русский словарь, например ABBYY Lingvo.
1.10. Работа с отладчиком
Полное описание возможностей встроенного отладчика Visual C++ и приемов работы с ним может потребовать отдельной книги, настолько объемна эта тема. Поэтому здесь приведены только начальные сведения о работе с отладчиком Visual C++. Проще всего это сделать, написав программу, заведомо содержащую несколько ошибок, а затем показав, как с помощью отладчика можно найти и исправить эти ошибки.
В частности, мы научимся устанавливать в программе точки прерывания и выполнять ее до заданной точки. Когда во время выполнения встречается точка прерывания, программа останавливается, а на экране появляется отлаживаемый код. Это дает возможность детально выяснить, что происходит в программе.
Кроме того, программу можно выполнять последовательно, строку за строкой — такой процесс называется пошаговым выполнением. Этот режим позволяет следить за тем, как изменяются значения различных переменных. Иногда он помогает понять, в чем заключается проблема: если обнаруживается, что переменная принимает неожиданное значение, то это может послужить отправной точкой для выявления ошибки. После обнаружения ошибки ее можно исправить и выполнить программу заново в отладочном режиме.
Назовем нашу программу (проект) именем Buggy. Программа должна вычислять среднее арифметическое первых пяти натуральных чисел: 1-5. Нетрудно догадаться, что ответ должен быть равен 3, однако из-за специально сделанных ошибок программа первоначально будет выдавать неправильный ответ.
Для создания программы выполните следующие действия:
- Создайте проект типа «консольное приложение» с именем Buggy.
- Добавьте к проекту файл buggy.срр и заполните его следующим текстом:
using namespace std;
float sum, average;
average = sum / N;
□ Запустите программу на выполнение.
Вы должны увидеть в консольном окне приложения нечто вроде следующего результата:
т. е. программа вычислила, что среднее арифметическое первых пяти целых чисел
равно -21474800 (на вашем компьютере может быть и другое число), а это мало
похоже на число 3.0.
Начнем отладку нашей злополучной программы.
1.10.1. Установка точки прерывания
Точка прерывания позволяет остановить выполнение программы перед любой выполняемой инструкцией (оператором) с тем, чтобы продолжать выполнение программы либо в пошаговом режиме, либо в непрерывном режиме до следующей точки прерывания.
Чтобы задать точку прерывания перед некоторым оператором, необходимо установить перед ним текстовый курсор и нажать клавишу F9. Точка прерывания обозначается в виде коричневого кружка на левом поле окна редактирования. Повторный щелчок на кружке снимает точку прерывания. В программе может быть несколько точек прерывания.
1.10.2. Выполнение программы до точки прерывания
Программа запускается в отладочном режиме с помощью команды Build ► Start Debug (или нажатием клавиши F5).
В результате код программы выполняется до строки, на которой установлена точка прерывания. Затем программа останавливается и отображает в окне Editor ту часть кода, где находится точка прерывания, причем желтая стрелка на левом поле указывает на строку, которая будет выполняться на следующем шаге отладки. Продолжим демонстрацию описываемых средств на примере программы Buggy:
- Установите точку прерывания перед оператором for.
- Запустите программу в отладочном режиме, нажав клавишу F5.
Обратите внимание — в Visual C++ на панели инструментов появилось меню Debug. Заглянем в него из любопытства.
Среди различных команд этого меню особый интерес представляют команды Step Into (F11), Step Over (F10), Step Out (Shift+F11), Run To Cursor (Ctrl+F10) и Stop Debugging (Shift+F5).
Выбор последней команды (или нажатие комбинации клавиш Shift+F5) вызывает завершение работы с отладчиком.
1.10.3. Пошаговое выполнение программы
Нажимая клавишу F10, можно выполнять один оператор программы за другим.
Предположим, что при пошаговом выполнении программы вы дошли до строки, в которой вызывается некоторая функция func1(). Если вы хотите пройти по коду вызываемой функции, то надо нажать клавишу F11. Если же внутренняя работа функции вас не интересует, а интересен только результат ее выполнения, то надо нажать клавишу F10.
Допустим, что вы вошли в код функции func1(), нажав клавишу F11, но через несколько строк решили выйти из него, т. е. продолжить отладку после возврата из функции. В этом случае надо нажать клавиши Shift+F11.
Источник: studizba.com