|
Программирование >> Аргументация конструирования
Выведенное сообщение не поможет вам в поиске ошибки необходимо пошагово входить в функции и выполнять их. Пошаговый режим с входом в функции Отладчик позволяет программисту входить в функции и выполнять их в пошаговом режиме. Эта возможность понадобится нам при поиске первой ошибки в этой программе. Сначала следует выполнить сброс программы. Для этого перезагрузите отладчик с помощью команды Program Reset. Затем выполняйте программу в пошаговом режиме Step Over, пока не дойдете до функции concatStringO. После этого воспользуйтесь командой Step In (пошаговый режим с заходом в функции), и указатель перейдет на начало функции concatstring (>, как показано на рис. 11.5. Рис. 11.5. Команда Step In заставляет отладчик перейти на первую выполняемую строку вызываемой функции Между командами Step In и Ste ег нет никакой разницы, если только в процессе прохода не выполняется вызов функции. Если ненамеренно выполнить команду Step In, отладчик может запросить имя файла с исходным кодом функции, о которой вы никогда не слышали. Возможно, этот исходный код находится в какой-то из библиотек. В этом случае щелкните на кнопке Cancel и попробуйте разобраться в наборе машинных инструкций (которые вряд ли много скажут даже опытным программистам). Чтобы вернуть себе после этого душевное равновесие, откройте окно редактирования программы, установите точку останова так, как описано в следуюшем разделе, и выполните команду Go. А пока воспользуйтесь командой Step Over, чтобы выполнить первую исполняемую строку функции. Сразу после этого rhide выведет такое же сообшение об ошибке, как и раньше. Теперь достоверно известно, что ошибка находится в операторе while и что именно она вызывает аварийное завершение программы. Чтобы узнать, что именно происходит, следует остановить программу непосредственно перед выполнением оператора while и разобраться в ней более детально. Использование точек останова Пошаговый режим хорош только на этапе предварительного поиска ошибки. После того как стало известно, в каком месте программы возникла ошибка, удобнее всего воспользоваться возможностью отладчика, называемой точкой останова. Чтобы увидеть, как работает точка останова, вновь сбросьте отладчик с помощью команды Program Reset. Мы могли бы снова добраться до оператора while в пошаговом режиме, как это было сделано ранее, однако постоянно выполнять большие программы в пошаговом режиме было бы слишком утомительно. Вместо этого можно установить точку останова. Поместите курсор на операторе while и выполните команду Set brealipoint. Редактор выделит эту строку красным цветом, как показано на рис. 11.6. TSIiHindotpB Helti vlSM/lllfc h:/sss.cpp int n1arge11hHpx; int nSourcelndex; найти конец первой строки mhi 1 е( sjiTerge 11 **nTaroet Index)) присоединяет вторую строку к коы Г!€1>вон whilefszSourcetnSourcelndeKil szTarget[niargetlndex] - 44 c e Index 1; Рис. 11.6. Строка с точкой останова выделена красным цветом Точка останова заставляет программу работать в нормальном режиме до точки, в которой нужно остановить программу. После этого отладчик перехватывает управление и останавливает программу. Точки останова очень удобны, если вы уже знаете, где искать ошибку, или если просто возникла необходимость выполнить программу до определенного места. После установки точки останова выполните команду Go. Программа будет выполняться нормально до тех пор, пока не дойдет до оператора while. После этого она передаст управление отладчику. Осталось только узнать, что же вызывает ошибку. Просмотр и редактирование переменных Нет смысла вновь выполнять оператор while, поскольку точно известно, что программа будет прервана в результате ошибки. Чтобы понять, почему возникает ошибка, необходимо получить дополнительную информацию. Например, не помешало бы узнать, что находится в переменной nTargetlndex непосредственно перед выполнением цикла while. int rllfeiigstlrnfeK; int nSoiircelndfix; h:/sss.C5p 1-tt]- Рис. 11.7. Отладчик позволяет программисту просматривать и изменять содержимоепеременных Сначала дважды щелкните мышью на имени переменное rget Index, а после этого вызовите команду отладчика View Variable. При этом появится окно с именем этой переменной в первой строке. Щелкните на кнопке Eval, чтобы узнать текущее значение переменной. Результат этих действий показан на рис. 11.7. Если еще раз внимательно просмотреть исходную программу, становится понятно, что в процессе ее выполнения не были инициализированы переменные nTargetlndex и nSourcelndex. Чтобы убедиться в этом, введите в строке ввода нового значения (New Value) значение О и щелкните на кнопке ОК (то же самое нужно сделать и для переменной nSourcelndex). После этого можно закрыть окно просмотра переменных и выполнить команду Step Over. Теперь, после инициализации этих переменных, программа уже не в]даст сообщения об ошибке. Каждое следующее выполнение команд Step Over или Sten вызовет повтор цикла while. Поскольку тело цикла не содержит никаких команд, курсор снова вернется на оператор while. При этом в ходе каждого выполнения nTargetln-dex будет увеличиваться на 1. Чтобы не открывать окно просмотра переменной во время каждого выполнения цикла, дважды щелкните на и вызовите команду Add Watch. Появится окно с именем этой переменной и ее значением в правой части. После этого выполните команду Step In еше несколько раз. При каждом повторении nTargetlndex будет увеличиваться на 1, а после нескольких циклов произойдет переход на следующую за циклом строку. Установите точку останова на строку, содержащую закрывающую фигурную скобку функции concatstring, и выполните команду Go. Программа остановится непосредственно перед выходом из функции. Чтобы проверить содержимое созданной этой функцией строки, дважды щелкните на переменной szTarget и выполните команду Vew Variable. Результат приведен на рис. 11.8. Число 0x68298 является адресом строки в памяти. Эта информация может пригодиться при отслеживании указателей. Адреса могут очень пригодиться при работе со связанными списками.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |