Команды отладки программ
Для перехода в командный режим отладки в m-файл следует включить команду keyboard. Ее можно запустить и в командном режиме:
» keyboard
К» type swl
switch var case {1.2,3}
disp('Первый квартал')
case {4.5.6}
dispC Второй квартал')
case {7,8,9}
disp('Третий квартал')
case {10,11.12}
disp('Четвертый квартал')
otherwise
disp('Ошибка в задании')
end
» return
»
Признаком перехода в режим отладки становится появление комбинированного символа К». Он меняется на символ » после возврата командой return в обычный командный режим работы. То же самое происходит при использовании команды dbquit, также прекращающей режим отладки, но прекращающей и выполнение т-файла. Если команда return находится в самом m-файле, она прекратит его выполнение и передаст управление туда, откуда был вызван этот файл.
Общие замечания по отладке m-файлов
Вряд ли существует программа с длиной более десятка строк, которая после запуска сразу бы выдала верный результат. Как правило, любую программу надо отлаживать в интерактивном режиме, запуская и анализируя полученные при каждой модификации результаты. Основным средством отладки m-файлов в системе MATLAB является встроенный редактор/отладчик (M-File Editor/Debuger) с современным графическим интерфейсом. Работа с ним была описана в уроке 5. Однако MATLAB предусматривает основные возможности отладки и в командном режиме. Именно они и рассматриваются в данном разделе.
Вообще говоря, отладка программ — процесс сугубо индивидуальный и творческий. Большинство пользователей средней квалификации обычно отлаживают программы, не обращаясь к специальным средствам отладки, требующим дополнительного времени для освоения и приобретения навыков использования. Если алгоритм решения задачи достаточно прост, то после нескольких модернизаций программы ее удается довести до нужной «кондиции», т. е. заставить работать корректно.
Для этого часто бывает достаточно ввести в программу режим просмотра результатов промежуточных вычислений, разблокировав их вывод снятием операторов ; (точка с запятой) или введя дополнительные переменные, значения которых отражают ход вычислений. После отладки можно вновь ввести блокирующие вывод операторы и убрать указанные переменные.
Серьезная необходимость в применении средств отладки возникает при отладке сложных программ опытными программистами, которые наверняка имеют практику работы с универсальными языками программирования с использованием развитых отладочных средств.
Построение диаграмм Парето
Команда profile plot использует для построения графическую команду pareto. Диаграмма Парето представляет собой столбцы, расположенные в порядке убывания отображаемых значений. С другими возможностями команды pareto можно ознакомиться, выполнив команду help pareto.
pareto(Y,NAMES) — строит диаграмму Парето с пометкой столбцов значений вектора Y соответствующими именами, содержащимися в векторе NAMES;
pareto(Y.X) — строит диаграмму Парето для значений вектора Y в зависимости от значений вектора X;
pareti(Y) — строит диаграмму Парето для значений вектора Y в зависимости от индексов его элементов;
[H,AX]=pareto(...) — возвращает вектор дескрипторов графических объектов диаграммы Н и их осей АХ.
Пример построения диаграммы Парето был рассмотрен выше (см. рис. 21.1).
Профилирование m-файлов
Вообще говоря, достижение работоспособности программы — лишь один из этапов ее отладки. Не менее важным вопросом является
оптимизация
программы по минимуму времени исполнения или по минимуму объема кодов. Современные
компьютеры, в которых используется система MATLAB, имеют достаточные резервы памяти, так что размеры программы, как правило, не имеют особого значения. Намного важнее проблема оптимизации программы в части быстродействия.
Оценка времени исполнения отдельных частей программы называется ее
профилированием.
Для выполнения такой процедуры служит команда profile [
Средства профилирования MATLAB позволяют анализировать только m-файлы функций, но не сценариев. Чтобы получить профиль выполнения сценария, приходится преобразовывать его в функции (как правило, не имеющую входных и выходных параметров), добавляя соответствующий заголовок function.
], имеющая ряд опций:
profile fun — запуск профилирования для функции fun;
profile report — вывод отчета о профилировании;
profile plot — графическое представление результатов профилирования в виде диаграммы Парето;
profile filename — профилирование файла с заданным именем и путем;
prof ile report N — вывод отчета по профилированию заданных N строк;
profile report frac — выводит отчет по профилированию тех строк, относительная доля выполнения которых в общем времени выполнения составляет не менее чем frac (от 0.0 до 1.0);
profileon — включение профилирования;
profile off — выключение профилирования;
profile reset — выключение профилирования с уничтожением всех накопленных данных;
INFO = profile — возвращает структуру со следующими полями:
file — полный путь к профилируемому файлу;
interval — интервалы времени в секундах;
count — вектор измерений;
state — состояние профилировщика: 'on' (включен) или 'off (выключен).
Ниже приводится пример на профилирование m-файла ellipj (эллиптическая функция Якоби):
» profile on
» profile ellipj
» ellipj([0:0.01:1].0.5); .
» profile report
Total time in "C:\MATLAB\toolbox\matlab
\specfun\ellipj.m": 0.16 seconds
100% of the total time was spent on lines:
[96 97 86]
85: if -isempty(in)
0.01s. 6% 86: phin(i.in) = 0.5 * ...
87:(asin(c(i+l.in).*sin(rem(phin(i+l.in)
.2*pi))./a(i+l,in))
95: ml = find(m==l):
0.11s. 69% 96: sn(ml) = tanh(u(ml)): 0.04s. 25*97:
cn(ml) = sech(u(ml));
98: dn(ml) = sech(udnl)):
» INFO=profile INFO=file:
'С:\MATLAB\toolboxNmatlab\specfun\el11pj.m'
interval: 0.0100
count: [98x1 double]
state: 'off '
» profile plot
Нетрудно заметить, что при профилировании выводятся номера строк программы, у которых время выполнения превосходит 0.01 с. С использованием этого интервала и оценивается время исполнения программного кода. Последняя команда выводит графическую диаграмму профилирования, показанную на рис. 21.1.
Рис. 21.1.
Графическое представление результатов профилирования
При графическом представлении профилирования по горизонтальной оси указываются номера строк, а по вертикальной — время их выполнения. Сначала показываются строки с наибольшим временем выполнения. Таким образом, программист, отлаживающий работу программы, имеет возможность наглядно оценить, где именно находятся критические по быстродействию фрагменты.
Просмотр рабочей области
В точках прерывания пользователь имеет возможность просмотреть состояние рабочей области с помощью ранее описанных команд who и whos — см. урок 5. Кроме того, для перемещения по рабочим областям стека вызванных функций вверх или вниз используются следующие команды:
dbdown — перемещение в стеке вызываемых функций сверху вниз;
dbup — перемещение в стеке вызываемых функций снизу вверх.
Находясь в рабочей области, можно не только просматривать значения переменных, но и менять их в ходе отладки программы. С помощью команды dbstack можно просматривать стек функций. Для завершения отладки используется команда
dbquit.
В заключение еще раз обращаем внимание читателя на то, что все возможности отладки реализованы в редакторе/отладчике m-файлов, который характеризуется удобным графическим интерфейсом и средствами визуализации отладки программ. К ним относятся возможность выделения различными цветами элементов m-файла (ключевых слов, переменных, комментариев и т. д.), наглядное представление точек прерывания, простота их установки и т. д. Щелкнув мышью справа от колонки с номерами строк, вы можете установить/снять точку прерывания в окне редактора-отладчика. После остановки в точке прерывания вы можете просмотреть значения всех переменных, подведя курсор мыши к символьному обозначению переменной в окне редактора-отладчика.
В этом отношении некоторые описанные выше приемы отладки в командном режиме выглядят несколько архаично. Скорее всего, они ориентированы на пользователей, привыкших к командному режиму работы с системой.
Работа с системой контроля версий
MATLAB поддерживает системы контроля версий кода Visual Source Safe фирмы Microsoft (поступает вместе с Visual Studio), PVCS фирмы Merant (упрощенные версии этой системы бесплатно поступают с продуктами Borland), Clear Case фирмы Rational Software (в особенности на UNIX-Linux версиях MATLAB), RCS и имеет настраиваемый пользовательский интерфейс, так что вместо вышеперечисленных вы можете подключить свою любимую систему. Функция cmopts выводит информацию об установленной системе контроля версий. Свежеустановленная система MATLAB реагирует следующим образом:
» cmopts
ans =
none
Для подключения PVCS или ее варианта вам нужно отредактировать m-файл cmopts.m в папке C:\matlabrl2\toolbox\local Введите комментарий Ubegin customization section и введите на следующей строчке m-файла, если файл конфигурации проекта Proj.cfg:
DefaultConfigFile=
'с:\\pvcs\pvcsproj\projmgrprj\\Proj.cfg'.
Проверим правильность нашей установки:
»cmopts( 'DefaultConflgFile')
DefaultConfigFile =
с:\\pvcs\pvcsproj\projmgrprj\\Proj.cfg
Командаcheckin(f11ename. 'COMMENTS', Текст комментариев, OPTION1, VALUE1.0PTION2, VALUE2.......) включает ваши файлы в систему контроля версий. Filename — полный
путь к файлу или строковый массив ячеек, где каждая ячейка указывает путь к файлам, Текст комментариев — массив символов, в данной версии option может быть только lock, value может быть on (замкнута) или off (позволяет доступ к файлу без checkout).
Команда checkout(filename, OPTION1, VALUE1.0PTION2. VALUE2.......) извлекает файлы из системы контроля версий. OPTION могут быть lock — аналогично checkin — и ревизия, т. е. указание конкретной версии файла. Команда undocheckout (Filename) — отменяет действие checkout, например замыкание файлов.
С пронумерованными строками
Один из способов отладки m-файлов — размещение в них точек прерывания. Однако в командном режиме нельзя задать установку таких точек с помощью курсора мыши (как в отладчике Windows). Поэтому необходимо иметь листинг программы с пронумерованными строками. Он создается с помощью команды dbtype.
Пример:
» keyboard
К» dbtype sw1
1 switch var
2 case {1.2.3}
3 disp(' Первый квартал')
4 case {4.5,6}
5 disp('Второй квартал')
6 case {7,8.9}
7 disp('Третий квартал')
8 case {10.11,12}
9 disp('Четвертый квартал')
10 otherwise
11 disp('Ошибка в задании')
12 end
K»
Создание итогового отчета
Для создания суммарного отчета о профилировании служит команда profsum, которая используется в нескольких формах:
profsumm — вывод полного отчета о результатах профилирования т-файла. Выводятся данные о времени выполнения для строк, суммарное время выполнения которых составляет 95% от общего времени (если таких строк много, выводятся данные о 10 строках, выполнение которых заняло наибольшее время);
profsumm(FRACTION) — выводит часть отчета для строк, относительное время выполнения которых составляет FRACTION (от 0.0 до 1.0) от общего времени выполнения файла;
profsurmi(N) — выводится отчет по N строкам с максимальным временем выполнения;
profsumm(STR) — выводит отчет только по тем строкам, в которых встречается строковое выражение STR;
profsumm(INFO), profsurmKINFO, FRACTION), profsumm(INFO, N) HprofsummdNFO, STR) -выводят итоговый отчет по строкам, заданным массивом INFO.
Пример применения команды profsumm:
» profile erfcore
» z = erf(0:.01:100):
» profsumm. profile done
Total time in "C:\MATLAB\toolbox\mat1ab
\specfun\erfcore.m": 0.16 seconds
94%
of the total time was spent on lines:
[99 109 108 97 95 94 92 86 71 48]
47:
%
0.01s. 6*48: k = find((abs(x)
> xbreak) & (abs(x) <= 4.)):
49: if -isempty(k)
70: del = (y-z).*(y+z):
0.01s, 6*71: result(k)
= exp(-z.*z) .* exp(-del) .* result(k)
72: end
85: 0.01s.
6%
86:
у
= abs(x(k)):
87: z = 1 ./ (y .* y):
91: xnum = (xnum + p(i)) .* z:
0.01s, 6*92: xden = (xden + q(i)) .* z:
93: end
0.01s, 6*94: result(k) =
z .* (xnum + p(5)) ./ (xden + q(5)):
0.01s, 6*95: result(k)
= (1/sqrt(pi) - result(k)) ./y:
96: if jint — 2 0.01s,
6%
97;
z
= fix(y*16)/16;
98: del - (y-z).*(y+z):
0.06s. 38*99: result(k) =
exp(-z.*z) .* exp(-del) .* result(k)
100: k - find(~isfinite(result));
107: if jint ==0
0.01s,
6%
108: k = find(x > xbreak);
0.01s,
6%
109: result(k)=
(0.5 - result(k)) + 0.5;
110: k = find(x < -xbreak);
Управление исполнением m-файла
После установки точек прерывания начинается собственно процесс тестирования m-файла. Он заключается в исполнении одного или нескольких шагов программы с возможностью просмотра содержимого рабочей области, т. е. значений переменных, меняющихся в ходе выполнения программы. Для пошагового выполнения программы используется команда dbstep в следующих формах:
dbstep — выполнение очередного шага;
dbstep nlines — выполнение заданного числа строк программы;
dbstep In — если следующая выполняемая строка текущего m-файла является вызовом функции из другого m-файла, эта форма позволяет перейти к первой исполняемой строке
вызываемой
функции и остановиться там;
dbstep out — если следующая выполняемая строка текущего m-файла является вызовом функции из другого m-файла, эта форма позволяет перейти к
вызываемой
функции и остановиться сразу же после ее выполнения.
Для перехода от одной остановки программы к другой используется команда dbcont.
Установка, удаление и просмотр точек прерывания
Для установки в тестируемый m-файл точек прерывания используются следующие команды:
dbstop In M-file at lineno — установить точку прерывания в заданной строке;
dbstop In M-file at subfun — установить точку прерывания в подфункции;
dbstop in M-file — установить точку прерывания в m-файле;
dbstop if error — установить точку прерывания при сообщении об ошибке, но не при ошибках внутри цикла try...catch;
dbstop if all error — установить точку прерывания при сообщении о любой ошибке;
dbstop if warning — установить точку прерывания при предупреждении;
dbstop if infnan или naninf — установить точку прерывания при результате Inf или NaN.
Можно использовать упрощенный ввод этих команд без использования слов in, at и if. При установке контрольной точки она появляется в окне редактора/отладчика m-файлов. Для удаления точек прерывания используется команда dbclear с тем же синтаксисом, что и dbstop, например:
dbclear M-file at 1 ineno — удалить точку прерывания в заданной строке заданного файла.
Команда dbstatus выводит список установленных в данной сессии точек прерывания.
Пример:
К» dbstatus
Breakpoint for C:\MATLAB\bin\demol.m is on line 2.
Breakpoint for C:\MATLAB\bin\sd.m is on line 3.
MATLAB 6 значительно изменила синтаксис по сравнению с предыдущими версиями. Поэтому полезно перед отладкой старых программ выполнить команду featureCorAndError' ,0) или просто feature('orAndError') — для выдачи предупреждений об ошибке при выполнении тех конструкций, интерпретация которых в новой версии изменилась. feature('orAndError' ,1) выдает сообщение об ошибке вместо предупреждения об ошибке.