Те, кто создавали (или просто набирал по бумажке) программы размером
больше экранной страницы, наверняка после набора программы (или ее
автономной работоспособной части) сталкивались с необходимостью
устранения ошибок в программе. Этот процесс называется отладкой.
Условно можно разделить сей этап на три части (номера указывают как
порядок, так и степень сложности): 1. Исправление синтаксических ошибок (без этого программа вообще не запускается) 2. Устранение сбоев, приводящих к завершению программы. 3. Коррекция неправильной работы программы Cинтаксические ошибки Они возникают в основном из-за опечаток или незнания синтаксиса команды и довольно легко устраняются. * Неправильное имя команды * Ошибка в имени переменной * Указание неверного типа переменной * Неверный тип данных в строке вызова процедуры * Нехватка данных в строке вызова Function * Пропущенные скобки (обычно, закрывающая) * Не та косая черта ("/" вместо "\" в ссылке на элемент типа) * Незавершенная структура (If Then без End If, Repeat без Forever, For без Next и т. д.) * Exit вместо Return в Function Сбои и коррекция неправильной работы программы Для поиска таких ошибок обычно используется отладчик. Причины могут быть самые разные: * Неправильный путь к файлу (или имя файла), отсутствие файла * Попытка доступа к несуществующему объекту (например, CreateEntity вернул 0) * Неверная инициализация (или ее отсутствие), неправильное изменение значения переменной * Упущенный из виду вариант, подлежащий обработке (а это значит нужно писать новую функцию / кусок кода) * Использование в Write\ReadPixelFast координат, выходящих за пределы изображения * Использование команд Write\ReadPixelFast без команды LockBuffer * Попытка доступа к элементу переменной со значением Null пользовательского типа * Ошибка в загружаемом файле (неверный синтаксис или порядок следования данных) Знакомство с отладчиком Когда вы запустите программу, включив Debug Mode, появится окно отладчика. Оно состоит из: * Панели с кнопками * Широкого окна с вкладкой Debug Log * Узкого окошка со вкладками Local, Global, Consts Кнопки выполняют следующие функции (во время работы программы доступны 1-я и 6-я, во время отладки со 2-й по 6-ю): 1. Светофор с красным сигналом - остановка программы 2. Светофор с зеленым сигналом - продолжение работы программы 3. Стрелка вправо - выполнение текущей строки и переход на следующую без входа в Function 4. Стрелка вправо-вниз - выполнение текущей строки и переход на следующую, при вызове Function - вход 5. Стрелка вправо-вверх - выполнение программы до выхода из Function (если находимся в главной программе, тогда просто пуск) 6. Ядерный взрыв - прекращение работы программы и выход в редактор
В большом окне появляется текст программы (на вкладке с именем файла) с
выделенной строкой - текущей, Debug Log - это журнал отладки, вы можете
писать в него строки во время выполнения программы с помощью команды
DebugLog message$. Вкладки маленького окошка (обновляются при остановке программы): * Local - дерево функций, в которые выполнен вход (включая главную программу на первой строке) с используемыми переменными * Global - список глобальных переменных со значениями * Consts - список констант со значениями
Во вкладке Local вы можете раскрывать дерево функции, содержащее
переменные с их значениями. Раскрыв переменную пользовательского типа,
вы можете просмотреть ее элементы и их значения (а если они, в свою
очередь являются типами - то раскрыть их). Точки останова
В редакторе их установка не предусмотрена, поэтому, если вы хотите,
чтобы в каком либо месте программа прервалась и вышла в отладчик,
поставьте команду "Stop". Работа с отладчиком - советы
Для начала, нужно определить точку сбоя. Обычно, это несложно -
программа выдает сообщение типа "Memory Access Violation" или "Object
does not exist" и вылетает в отладчик. Теперь вы можете посмотреть, в
какой строке произошел сбой и определить переменную с неправильным
значением. Если в строке используются вычисляемые выражения или
элементы массива, то чтобы просмотреть их значения, нужно создать
переменную, присвоив ей значение этого выражения (или элемента
массива): ;Пример кода WritePixel x+dx(5),y+sqr(xx*xx+yy*yy),-1 ;Код, подходящий для отладки x0=x+dx(5) y0=y+sqr(xx*xx+yy*yy) WritePixel x0,y0,-1 ;Теперь можно точно узнать координаты записываемого пиксела
После выяснения имени переменной с неверным значением, постепенно
распутываем загадку, прослеживая процесс работы программы в обратном
направлении: устанавливаем точки останова выше, смотрим значение этой
переменной на ранних этапах работы программы. Если выясняется, что
переменная функционирует правильно, а ошибка происходит из-за другой
переменной связанной с текущей, то переключаемся на нее, et cetera... Если сбой произошел в цикле, полезным будет выяснить, почему предыдущие этапы прошли без сбоев, а текущий вызвал сбой.
Не забывайте о возможности записи значений переменных, а также
информации о прохождении какого-л этапа программы в журнал отладки
(Debug Log). Это позволит быстро выяснить, где и почему произошел сбой.
Можно также выводить отладочную информацию в файл или на экран.
Иногда бывает полезно написать отладочную утилиту (например,
отображающую связи между переменными пользовательского типа или
выводящую таблицу значений массива). В приложениях, использующих
трехмерную графику, можно создавать сферы и помещать их на место
виртуальных точек (скажем, вершин многогранника, если треугольники
заданы неправильно или еще не заданы), включая pivots.
|