|
| ||||||||||||
| ||||||||||||
CTRACE(1)НАЗВАНИЕ СИНТАКСИС ctrace [-f функция ...] [-v функция ...] [-o] [-x] [-u] [-е] [-lчисло_операторов] [-s] [-tчисло_переменных] [-P] [-b] [-pцепочка_символов] [-rфайл] [файл] ОПИСАНИЕ Перед выполнением оператора отладчик выводит его на терминал вместе с именами и значениями всех используемых переменных, затем оператор выполняется, после чего выдаются имена и значения переменных, модифицированных этим оператором. Отладчик обнаруживает циклы и выключает трассировку до тех пор, пока не происходит выход из цикла или не выполняется другая последовательность действий внутри цикла. Через каждые 1000 итераций выводятся предупреждающие сообщения, чтобы помочь обнаружить бесконечные циклы. Трассировочная печать идет на стандартный вывод, следовательно, ее можно направить в некоторый файл для последующей обработки с помощью редактора или команд bfs(1) или tail(1). Обычно используемые опции:
Имеются стандартные и дополнительные форматы вывода значений переменных. Длинные целые и указатели всегда распечатываются как целые со знаком. Указатели на массивы символов, если это нужно по смыслу, распечатываются еще и как цепочки символов. Символьные, короткие целые и целые значения распечатываются как целые со знаком и, если нужно, как символы. Плавающие значения двойной точности распечатываются в экспоненциальном формате. Можно потребовать, чтобы значения распечатывались еще и в дополнительном формате, указав следующие опции:
Следующие опции используются только в специальных случаях:
Следующие опции используются для обеспечения трассировки программ, которые будут выполняться не в среде операционной системы UNIX:
ПРИМЕР
1 #include <stdio.h>
2 main() /* Подсчет числа вводимых строк */
3 {
4 int c,nl;
5
6 nl = 0;
7 while ((c=getchar()) != EOF)
8 if (c = '\n')
9 ++nl;
10 printf ("%d\n",nl);
11}
и Вы вводите такие команды и тестовые данные:
cc lc.c a.out 1 CTRL+D Программа будет откомпилирована и выполнена. Результатом работы программы будет число 2, но это неверный результат, так как тестовые данные содержат только одну строку. Ошибка в этой программе банальная, но коварная. Если Вы вызовете отладчик ctrace с помощью команд ctrace lc.c > temp.c cc temp.c a.outто результат будет таким: 2 main() 6 nl = 0; /* nl == 0 */ 7 while ((c=getchar()) != EOF)Теперь программа ждет ввода. Если Вы вводите те же тестовые данные, что и ранее, получится следующее:
/* c == 49 or '1' */
8 if (c = '\n')
/* c == 10 or '\n' */
9 ++nl;
/* nl == 1 */
7 while ((c=getchar()) != EOF)
/* c == 10 or '\n' */
8 if (c = '\n')
/* c == 10 or '\n' */
9 ++nl;
/* nl == 2 */
/* repeating */
/* repeated < 1 time */
7 while ((c=getchar()) != EOF)
Если теперь ввести символ конца файла, получится окончательный результат:
/* c == -1 */
10 printf ("%d\n",nl);
/* nl == 2 */ 2
/* return */
Обратите внимание на печать значения переменной nl сразу после трассировки оператора printf. Также обратите внимание на комментарий /* return */, добавленный отладчиком ctrace в конце трассировки. Он указывает на неявный выход из функции по достижении закрывающей скобки. Трассировочная печать показывает, что переменной c присваивается значение '1' в строке 7, а в строке 8 она уже имеет значение '\n'. Раз Вы обратили внимание на оператор if в строке 8, то Вы, скорее всего, догадаетесь, что использовали оператор присваивания = вместо сравнения ==. Во время простого просмотра текста программы эту ошибку легко пропустить. Управление трассировкой во время выполнения Вставляя в программу вызовы функций ctroff( ) и ctron( ), можно, соответственно, выключать или включать трассировку во время выполнения. Тем самым, используя операторы if языка C, можно реализовать сколь угодно сложный способ управления трассировкой. На основании того факта, что ctrace определяет переменную препроцессора CTRACE, реализуется условная вставка операторов управления трассировкой, например #ifdef CTRACE if (c == '!" && i > 1000) ctron (); #endifЕсли программа оттранслирована с опцией -g, функции включения/выключения трассировки можно вызвать из отладчика sdb(1). Например, чтобы отслеживать выполнение всех строк главной программы, кроме интервала строк с седьмой по десятую, введите следующие команды: sdb a.out main:7b ctroff() main:11b ctron() r Допускается также выключение и включение трассировки установкой значения переменной tr_ct_ в 0 или 1 соответственно. Такой способ целесообразен, если используется отладчик, который не предоставляет возможности вызвать функции ctroff( ) и ctron( ) непосредственно. ФАЙЛЫ
СМ. ТАКЖЕ ДИАГНОСТИКА Диагностика отладчика ctrace
Диагностика компилятора cc
ПРЕДОСТЕРЕЖЕНИЯ Определение функции с таким же именем, что и у системной функции, может привести к синтаксической ошибке, если изменено количество аргументов. Используйте лучше другое имя. Отладчик ctrace предполагает, что BADMAG является макросом препроцессора и что EOF и NULL являются константами, определенными с помощью директивы #define. Описание любого из этих об ектов как переменной, например int EOF;, вызовет синтаксическую ошибку. СЮРПРИЗЫ Указатели всегда трактуются как указатели на цепочки символов. Отслеживание циклов трассировки производится отдельно для каждого файла многофайловой программы. В результате функция, вызываемая в цикле, может продолжать трассироваться, или же некоторая функция не будет трассироваться до вызова другой функции из того же файла. Опция -l не работает; ctrace все равно использует подразумеваемое значение 20. |
|
CITForum © 1997–2025