mark.zlatoust.ru Послать письмо Webmaster-у Web-Master © Бернадинер Марк 

Златоуст.Ru

 

 

      CTRACE(1)                                             CTRACE(1)

      НАЗВАНИЕ
              ctrace - отладчик C-программ

      СИНТАКСИС
              ctrace  [-f функция ...] [-v функция ...] [-o] [-x] [-u] [-е]
                  [-lчисло_операторов] [-s] [-tчисло_переменных] [-P] [-b]
                  [-pцепочка_символов] [-rфайл] [файл]

      ОПИСАНИЕ
              Команда ctrace позволяет отслеживать выполнение C-прог-
              рамм, от оператора к оператору. Это напоминает исполне-
              ние процедуры shell'а с опцией -x. Отладчик ctrace  чи-
              тает C-программу из файла (или со  стандартного  ввода,
              если файл не задан), вставляет  функции  печати  текста
              каждого исполняемого оператора и значений всех  исполь-
              зуемых или модифицируемых переменных, и пишет  изменен-
              ную программу на стандартный  вывод.  Результат  работы
              команды ctrace следует поместить во временный файл, так
              как команда cc(1) не позволяет использовать каналы. За-
              тем временный файл нужно скомпилировать и выполнить.

              Перед выполнением оператора  отладчик  выводит  его  на
              терминал вместе с именами и значениями всех  используе-
              мых переменных, затем оператор выполняется, после  чего
              выдаются имена и значения переменных,  модифицированных
              этим оператором. Отладчик обнаруживает циклы и выключа-
              ет трассировку до тех пор, пока не происходит выход  из
              цикла или не выполняется другая последовательность дей-
              ствий внутри цикла. Через каждые 1000 итераций выводят-
              ся предупреждающие сообщения, чтобы  помочь  обнаружить
              бесконечные циклы. Трассировочная печать идет на  стан-
              дартный вывод, следовательно, ее можно направить в  не-
              который файл для последующей обработки с помощью редак-
              тора или команд bfs(1) или tail(1).

              Обычно используемые опции:

              -f функция ...
                   Отслеживать только указанные функции.

              -v функция ...
                   Отслеживать все функции, кроме указанных.

              Имеются  стандартные  и  дополнительные  форматы вывода
              значений переменных. Длинные целые и  указатели  всегда
              распечатываются  как целые со знаком. Указатели на мас-
              сивы символов, если это нужно по смыслу, распечатывают-
              ся еще и как цепочки символов. Символьные, короткие це-
              лые и целые значения распечатываются как целые со  зна-
              ком  и,  если  нужно,  как  символы. Плавающие значения
              двойной  точности  распечатываются  в  экспоненциальном
              формате. Можно потребовать, чтобы значения распечатыва-
              лись  еще  и в дополнительном формате, указав следующие
              опции:

              -o   Восьмеричный формат.

              -x   Шестнадцатеричный формат.

              -u   Беззнаковый формат.

              -е   Формат вещественных чисел.

              Следующие опции используются только в специальных  слу-
              чаях:

              -lчисло_операторов
                   Контролировать  заданное число последовательно вы-
                   полняемых операторов на предмет цикла трассировки,
                   а не 20, как считается по  умолчанию.  Чтобы  пол-
                   ностью трассировать циклы, используйте значение 0.

              -s   Отменить ненужную трассировку  простых  операторов
                   присваивания и вызовов функций копирования цепочек
                   символов. Эта опция может скрыть ошибки, вызванные
                   использованием операции = вместо ==.

              -tчисло_переменных
                   Отслеживать заданное число_переменных для  каждого
                   оператора, а не 10, как по умолчанию (максимальным
                   значением  n  является  20). В разделе ДИАГНОСТИКА
                   об ясняется, когда нужно использовать эту опцию.

              -P   Перед выполнением трассировщика запустить  препро-
                   цессор языка C. Можно использовать также опции -D,
                   -I и -U препроцессора cpp(1).

              Следующие опции используются для обеспечения трассиров-
              ки программ, которые будут выполняться не в среде  опе-
              рационной системы UNIX:

              -b   Использовать для трассировки только базовые  функ-
                   ции, то есть функции,  описанные  в  статьях  cty-
                   pe(3C), printf(3S) и string(3C). Эти функции  есть
                   даже в кросскомпиляторах для микропроцессоров. Оп-
                   ция -b необходима,  в  частности,  при  выполнении
                   трассируемых программ в  операционной  системе,  в
                   которой   нет   функций   signal(2),   fflush(3S),
                   longjmp(3C) или setjmp(3C).

              -pцепочка_символов
                   Изменить подразумеваемое  значение  трассировочной
                   функции   печати   printf(.   Например,   указание
                   -p'fprintf(stderr,' приведет к тому, что  отладоч-
                   ная печать пойдет в стандартный протокол.

              -rфайл
                   Использовать файл вместо пакета функций трассиров-
                   ки runtime.c.  Это  позволяет  полностью  изменить
                   функцию  печати,  а не только ее название и первые
                   аргументы, как в случае опции -p.

      ПРИМЕР
              Пусть файл lc.c содержит следующую C-программу:

                   1 #include 
                   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, то Вы, скорее  всего,  догадае-
              тесь, что использовали оператор присваивания  =  вместо
              сравнения ==. Во время простого просмотра текста  прог-
              раммы эту ошибку легко пропустить.

           Управление трассировкой во время выполнения
              Стандартный режим трассировки охватывает всю программу,
              если только не заданы опции -f или -v  для  трассировки
              избранных функций. Стандартное использование  отладчика
              ctrace не дает  возможности  пооператорного  управления
              трассировкой, не позволяет выключать и включать трасси-
              ровку во время выполнения отлаживаемой программы.

              Вставляя    в   программу   вызовы  функций 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( ) непосредственно.

      ФАЙЛЫ
              /usr/lib/ctrace/runtime.c      Трассировочное окружение
                                             времени выполнения.

      СМ. ТАКЖЕ
              bfs(1), tail(1).
              signal(2),     ctype(3C),    fclose(3S),    printf(3S),
              setjmp(3C), string(3C) в Справочнике программиста.

      ДИАГНОСТИКА
              В этом разделе  поясняются  диагностические  сообщения,
              выдаваемые как трассировщиком ctrace, так и  компилято-
              ром cc(1), поскольку трассиривочные действия часто при-
              водит к каким-то предупреждающим сообщениям от компиля-
              тора cc(1). В редких случаях появляются и сообщения  об
              ошибках, но их можно избежать.

           Диагностика отладчика ctrace
              warning: some variables are not traced in this statement
                   В каждом операторе отслеживаются только  10  пере-
                   менных,  чтобы  избежать ошибки C-компилятора "out
                   of tree  space;  simplify  expression"  (исчерпано
                   пространство для дерева, упростите выражение). Для
                   увеличения  числа отслеживаемых переменных исполь-
                   зуйте опцию -t.

              warning: statement too long to trace
                   Оператор имеет длину  более  400  символов.  Чтобы
                   уменьшить длину, используйте для выделения  отсту-
                   пов символы табуляции, а не пробелы.

              cannot handle preprocessor code, use -P option
                   Обычно это происходит, когда в середине C-операто-
                   ра есть директивы препроцессора #ifdef/#endif  или
                   в конце директивы препроцессора #define стоит сим-
                   вол точки с запятой.

              'if...else if' sequence too long
                   Упростите конструкцию, удалив ключевое слово  else
                   из середины.

              possible syntax error, try -P option
                   Попробуйте использовать опцию -P для обработки ис-
                   ходного файла с соответствующими  опциями  препро-
                   цессора -D, -I, или -U. Если диагностическое сооб-
                   щение  не исчезло, посмотрите разделы предупрежде-
                   ний ниже.

           Диагностика компилятора cc
              warning: illegal combination of pointer and integer
              warning: statement not reached
              warning: sizeof returns 0
                   Не обращайте внимания.

              compiler takes size of function
                   См. выше сообщение отладчика ctrace "possible syn-
                   tax error".

              yacc stack overflow
                   См. выше сообщение  отладчика  ctrace  "'if...else
                   if' sequence too long".

              out of tree space; simplify expression
                   Используйте опцию -t для уменьшения, по  сравнению
                   с подразумеваемым значением 10, количества  отсле-
                   живаемых в одном операторе переменных. Не обращай-
                   те внимания на предупреждающее сообщение  "ctrace:
                   too many variables to trace", которое Вы  получите
                   теперь.

              redeclaration of signal
                   Либо исправьте описание  функции  signal(2),  либо
                   удалите его и включите в текст файл .

      ПРЕДОСТЕРЕЖЕНИЯ
              Вы получите сообщение от отладчика ctrace  о  синтакси-
              ческой ошибке, если опустите точку с запятой после пос-
              леднего элемента описания записи или  об единения,  не-
              посредственно перед правой скобкой }. Некоторые  C-ком-
              пиляторы не требуют этой точки с запятой.

              Определение функции с таким же именем, что и у  систем-
              ной функции, может привести  к  синтаксической  ошибке,
              если изменено количество аргументов. Используйте  лучше
              другое имя.

              Отладчик ctrace предполагает, что BADMAG является  мак-
              росом препроцессора и что EOF и NULL являются  констан-
              тами, определенными с помощью директивы #define. Описа-
              ние любого из этих об ектов  как  переменной,  например
              int EOF;, вызовет синтаксическую ошибку.

      СЮРПРИЗЫ
              Отладчик  ctrace  не  имеет  информации  о  компонентах
              структур данных таких, как записи, об единения и масси-
              вы. Он не в состоянии выбрать формат, чтобы распечатать
              компоненты структуры данных, когда происходит  присваи-
              вание значения всей структуре.  Отладчик  может  вместо
              структуры распечатать ее адрес или использовать  невер-
              ный формат (например, 1.23456e-123 для записи  с  двумя
              целыми компонентами).

              Указатели всегда трактуются как  указатели  на  цепочки
              символов.

              Отслеживание циклов трассировки  производится  отдельно
              для каждого файла многофайловой программы. В результате
              функция, вызываемая в цикле, может продолжать трассиро-
              ваться, или же некоторая функция не будет трассировать-
              ся до вызова другой функции из того же файла.

              Опция -l не работает; ctrace все равно использует  под-
              разумеваемое значение 20.



 

 

Бернадинер Марк Абрамович

Мое резюме

Компьютерная страничка

Ресурсы сети

Фотоальбом

 

 

 

mark.zlatoust.ru Послать письмо Webmaster-у Web-Master © Бернадинер Марк