Страница 24 из 69
Вы отладили цикл while, который считывает и обрабатывает
входной файл. В этом цикле есть несколько мест, где вас могут
ожидать ошибки, и для того, чтобы их найти вам нужно чтобы на
входе WORDCNT чувствовал специфичные типы, например, такие, как
- 193,194 -
пустые строки. Однако, мы отложим поиск таких ошибок и приступим
к проверке цикла for, который выводит результаты.
Вам необходимо выполнить WORDCNT до строки, содержащей цикл
for (приблизительно 117 строка). Как вам известно, можно
переместить курсор в эту строку, установить контрольную точку и
выбрать опцию Run/Run. Но сейчас мы будем использовать более
удобную технику, если вы предполагаете останавливаться только в
определенных точках.
Переместите курсор к строке, в которой начинается цикл for,
и выберите Run/Go to Cursor (или F4). Отладчик выполнит WORDCNT и
остановится в той строке, где находится курсор. (Останов может
произойти раньше в контрольной точке, но в этой части программы
они не устанавливались).
Выполните один оператор, шкала выполнения переместится на
оператор printf цикла for. Заметим, что в цикле for нет контроль-
ной точки. Run/Go to Cursor является одноразовой операцией; она
не устанавливает контрольную точку.
Начните пошаговое выполнение цикла for с помощью Run/Trace
Into. Обратите внимание, что Run/Trace Into трассировку функции
printf не выполняет. Это происходит потому, что функция printf не
определена в исходном файле. Отладчик может только выполнять та-
кие функции, но не может их трассировать. (В этом случае нет дру-
гого выхода, трассировка этой функции невозможна: исходного текс-
та функции printf в вашем файле нет).
Каждый раз, когда вы выполняете строку, содержащую вызов
printf, отладчик открывает экран выполнения (Execution). На него
будет выводиться текст, выводимый printf. Отладчик сохранит экран
выполнения до тех пор, пока будет выполняться оператор, содержа-
щий функцию printf.
Вы вероятно не сможете прочитать вывод программы в столь ко-
роткий промежуток времени, пока экран выполнения виден, но с по-
мощью Run/User Screen (или Alt-F5) можно перейти в режим экрана
пользователя и наблюдать работу WORDCNT.
Замечание: С другой стороны, если заметить, что вывод прог-
раммы переписывается в ваш исходный текст в окно Edit, то вы мо-
жете избавиться от этого, выбрав Debug/Refresh Display для реге-
нерации экрана. Затем проконтролируйте, чтобы опция Debug/Display
- 195,196 -
Swapping была установлена в состояние Smart или Always.
(Более полная информация об этой опции рассматривается в
Главе 5).
На этом четвертое упражнение заканчивается. Мы покидаем вас,
а вы можете поискать ошибки в цикле for, и если их обнаружите, то
исправьте.
Замечание: Мы обещали, что WORDCNT содержит несколько оши-
бок. Вы нашли их? Каждая из них упоминается в разделе "Алгоритм
для эффективного тестирования программного обеспечения", приве-
денного в конце этой главы.
Упражнение 5: работа с большими программами
-----------------------------------------------------------------
Отладчик имеет несколько дополнительных возможностей, помо-
гающих вам при работе с большими исходными текстами и многофайло-
выми программами. В следующем разделе мы продемонстрируем их. Для
того, чтобы использовать одну из них, вы должны компилировать ва-
шу программу с включенной опцией Options/Compiler/Code Generation
/Standard Stack Frame. Проверьте эту опцию. Если она выключена,
то включите ее, затем убедитесь, что WORDCNT загружен в окно Edit
и перекомпилируйте, нажав Alt-F9. Начните сеанс отладки с помощью
Run/Step Over или, нажав F8.
Поиск определенной функции
---------------------------
Debug/Find Function выполняет прокрутку описаний функций в
окне Edit. Она поможет найти некоторую функцию в программе, кото-
рую можно откомпилировать с флагом Debug/Source Debugging и O/O/C
/OBJ Debugging Information в состояние On.
- 197,198 -
Debug/Find Function полезна в том случае, если введенная ва-
ми ошибка в одной части программы, должна быть исправлена с по-
мощью изменений в других частях.
Для проверки этой команды, переместите курсор в
небезизвестную вам строку, содержащую вызов wordlen. Выберите
Run/Go to Cursor. Затем переместите курсор на wordlen и выберите
Debug/Find Function. Отладчик откроет окно и выдаст приглашение
для ввода имени функции; так как wordlen это функция, которую мы
хотели найти, то вводите ее имя, и нажмите Ввод. Отладчик выведет
описание функции в окне Edit.
Стек вызова
-----------
Когда вы отлаживаете программу, содержащую вызовы функций
различных уровней, вам иногда будет нужно просмотреть стек вызо-
ва, который содержит имена вызывавшихся функций в порядке их вы-
полнения. Для этой возможности необходимо включить опцию Options/
Compiler/Code Generation/Standard Stack Frame.
Войдите в wordlen, затем выберите Debug/Call Stack (или Ctrl
-F3). Отладчик выведет стек вызова во всплывающем окне. Функция,
выполняемая в данный момент, будет находиться в вершине стека, а
на дне стека будет main. Заметьте, что в стек выводятся не только
имена функций, но и значения их параметров.
Для того, чтобы посмотреть, какая строка выполняется, вам
необходимо переместить светящееся поле в окне стека на имя функ-
ции и нажать Ввод. Например, для того, чтобы узнать, какая строка
main выполняется в данный момент, переместите поле в окне стека
на main и нажмите Ввод. Отладчик прокрутит часть main и выведет
строку, содержащую вызов wordlen в окне Edit. Если имеются допол-
нительные точки входа стека вызова, то вы можете вывести выполня-
ющуюся строку любой другой функции, выбрав Debug/Call Stack снова
и другую точку входа стека.
Возврат в позицию выполнения
----------------------------
- 199,200 -
Вы можете также использовать опцию Debug/Call Stack для
возврата к маркеру выполнения после просмотра других частей прог-
раммы. Для этого необходимо выбрать самую верхнюю функцию стека
вызова. Попробуйте.
На этом упражнения с отладчиком заканчиваются.
О многофайловых исходных текстах
-----------------------------------------------------------------
Все команды отладчика работают с программами, состоящими из
нескольких файлов. Например, если вы выбрали Debug/Find Function
для того, чтобы найти функцию, которая описана в другом файле,
отладчик загрузит трубуемый файл в окно Edit. Если захотите сде-
лать изменения текущего файла, отладчик спросит хотите ли вы сох-
ранить файл, который был загружен предыдущим.
Подобно этому, когда вы выбираете функцию из стека вызова
(используя Debug/Call Stack), отладчик перезагружает окно Edit.
Точно так же отладчик дает запрос на сохранение. Если программа
состоит из большого количества файлов, то одновременно отлаживать
лучше только несколько.
- 201,202 -