Урок №21.

Отладка программ

Отладка программ — не менее серьезный этап, чем их подготовка. К сожалению, это редко учитывают начинающие программисты, ослепленные успехом работы первых простеньких программ. Однако по мере усложнения программ необходимость в средствах их отладки возрастает. Этот урок посвящен тем средствам отладки, которые имеются в системе MATLAB.

Общие замечания по отладке m-файлов

Вряд ли существует программа с длиной более десятка строк, которая после запуска сразу бы выдала верный результат. Как правило, любую программу надо отлаживать в интерактивном режиме, запуская и анализируя полученные при каждой модификации результаты. Основным средством отладки m-файлов в системе MATLAB является встроенный редактор/отладчик (M-File Editor/Debuger) с современным графическим интерфейсом. Работа с ним была описана в уроке 5. Однако MATLAB предусматривает основные возможности отладки и в командном режиме. Именно они и рассматриваются в данном разделе.

Вообще говоря, отладка программ — процесс сугубо индивидуальный и творческий. Большинство пользователей средней квалификации обычно отлаживают программы, не обращаясь к специальным средствам отладки, требующим дополнительного времени для освоения и приобретения навыков использования. Если алгоритм решения задачи достаточно прост, то после нескольких модернизаций программы ее удается довести до нужной «кондиции», т. е. заставить работать корректно.

Для этого часто бывает достаточно ввести в программу режим просмотра результатов промежуточных вычислений, разблокировав их вывод снятием операторов ; (точка с запятой) или введя дополнительные переменные, значения которых отражают ход вычислений. После отладки можно вновь ввести блокирующие вывод операторы и убрать указанные переменные.

Серьезная необходимость в применении средств отладки возникает при отладке сложных программ опытными программистами, которые наверняка имеют практику работы с универсальными языками программирования с использованием развитых отладочных средств.

Команды отладки программ

Для перехода в командный режим отладки в m-файл следует включить команду keyboard. Ее можно запустить и в командном режиме:

» keyboard 

К» type swl

switch var case {1.2,3}

dispCПервый квартал') 

case {4.5.6}

dispC Второй квартал') 

case {7,8,9}

dispC'Третий квартал') 

case {10,11.12}

disp('Четвертый квартал')

 otherwise

disp('Ошибка в задании') 

end

К» return 

»

Признаком перехода в режим отладки становится появление комбинированного символа К». Он меняется на символ » после возврата командой return в обычный командный режим работы. То же самое происходит при использовании команды dbquit, также прекращающей режим отладки, но прекращающей и выполнение т-файла. Если команда return находится в самом m-файле, она прекратит его выполнение и передаст управление туда, откуда был вызван этот файл.

Вывод листинга m-файла с пронумерованными строками

Один из способов отладки 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

Установка, удаление и просмотр точек прерывания

Для установки в тестируемый m-файл точек прерывания используются следующие команды:

Можно использовать упрощенный ввод этих команд без использования слов in, at и if. При установке контрольной точки она появляется в окне редактора/отладчика m-файлов. Для удаления точек прерывания используется команда dbclear с тем же синтаксисом, что и dbstop, например:

Пример:

К» 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) выдает сообщение об ошибке вместо предупреждения об ошибке.

Управление исполнением m-файла

После установки точек прерывания начинается собственно процесс тестирования m-файла. Он заключается в исполнении одного или нескольких шагов программы с возможностью просмотра содержимого рабочей области, т. е. значений переменных, меняющихся в ходе выполнения программы. Для пошагового выполнения программы используется команда dbstep в следующих формах:

Для перехода от одной остановки программы к другой используется команда dbcont.

Просмотр рабочей области

В точках прерывания пользователь имеет возможность просмотреть состояние рабочей области с помощью ранее описанных команд who и whos — см. урок 5. Кроме того, для перемещения по рабочим областям стека вызванных функций вверх или вниз используются следующие команды:

Находясь в рабочей области, можно не только просматривать значения переменных, но и менять их в ходе отладки программы. С помощью команды dbstack можно просматривать стек функций. Для завершения отладки используется команда dbquit.

В заключение еще раз обращаем внимание читателя на то, что все возможности отладки реализованы в редакторе/отладчике m-файлов, который характеризуется удобным графическим интерфейсом и средствами визуализации отладки программ. К ним относятся возможность выделения различными цветами элементов m-файла (ключевых слов, переменных, комментариев и т. д.), наглядное представление точек прерывания, простота их установки и т. д. Щелкнув мышью справа от колонки с номерами строк, вы можете установить/снять точку прерывания в окне редактора-отладчика. После остановки в точке прерывания вы можете просмотреть значения всех переменных, подведя курсор мыши к символьному обозначению переменной в окне редактора-отладчика.

В этом отношении некоторые описанные выше приемы отладки в командном режиме выглядят несколько архаично. Скорее всего, они ориентированы на пользователей, привыкших к командному режиму работы с системой.

Профилирование m-файлов

Вообще говоря, достижение работоспособности программы — лишь один из этапов ее отладки. Не менее важным вопросом является оптимизация программы по минимуму времени исполнения или по минимуму объема кодов. Современные компьютеры, в которых используется система MATLAB, имеют достаточные резервы памяти, так что размеры программы, как правило, не имеют особого значения. Намного важнее проблема оптимизации программы в части быстродействия.

Оценка времени исполнения отдельных частей программы называется ее профилированием. Для выполнения такой процедуры служит команда profile [Средства профилирования MATLAB позволяют анализировать только m-файлы функций, но не сценариев. Чтобы получить профиль выполнения сценария, приходится преобразовывать его в функции (как правило, не имеющую входных и выходных параметров), добавляя соответствующий заголовок function.], имеющая ряд опций:

Ниже приводится пример на профилирование 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. Графическое представление результатов профилирования

При графическом представлении профилирования по горизонтальной оси указываются номера строк, а по вертикальной — время их выполнения. Сначала показываются строки с наибольшим временем выполнения. Таким образом, программист, отлаживающий работу программы, имеет возможность наглядно оценить, где именно находятся критические по быстродействию фрагменты.

Создание итогового отчета

Для создания суммарного отчета о профилировании служит команда profsum, которая используется в нескольких формах:

Пример применения команды 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)

= (l/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);

Построение диаграмм Парето

Команда profile plot использует для построения графическую команду pareto. Диаграмма Парето представляет собой столбцы, расположенные в порядке убывания отображаемых значений. С другими возможностями команды pareto можно ознакомиться, выполнив команду help pareto.

Пример построения диаграммы Парето был рассмотрен выше (см. рис. 21.1).

Работа с системой контроля версий

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

Что нового мы узнали?

В этом уроке мы научились: