Можно перенаправить вывод в другой файл с помощью опции
– f filename
и добавить его в конец существующего файла, указав опцию
– а
.
cxref
Программа
cxref
анализирует исходный текст на языке С и формирует перекрестные ссылки. Она показывает, где в программе упоминается каждое символическое имя (переменная, директива
#define
и функция). Программа создает отсортированный список с указанием места определения каждого идентификатора,
которое помечается звездочкой, как показано далее:
SYMBOL FILE FUNCTION LINE
BASENID prog.с -- *12 *96 124 126 146 156 166
BINSIZE prog.с -- *30 197 198 199. 206
BUFMAX prog.с -- *44 45 90
BUFSIZ /usr/include/stdio.h -- *4
EOF /usr/include/stdio.h -- *27
argc prog.с -- 36
prog.с main *37 61 81
argv prog.с -- 36
prog.с main *38 61
calldata prog.с -- *5
prog.с main 64 188
calls prog.с -- *19
prog.с main 54
На машине одного из авторов этой книги предыдущий вывод был сгенерирован в каталоге с исходными файлами приложения с помощью команды
$ cxref *.с *.h
но точный синтаксис зависит от версии. См. документацию к вашей системе и интерактивное справочное руководство для получения дополнительной информации о том, включена ли программа
cxref
и как ее применять.
cflow
Программа
cflow
выводит дерево вызовов функций — схему, показывающую, какие функции вызывают другие функции, какие функции вызываются этими другими и т.д. Эта схема полезна для выяснения структуры программы, понимания ее принципов действия и наблюдения за влиянием изменений, внесенных в функцию. Некоторые версии программы
cflow
могут работать с объектными файлами так же, как с исходными. Подробности см. в интерактивном справочном руководстве.
Далее приведен пример вывода, полученный версией
cflow
(cflow-2.0), которая есть в Интернете и поддерживается Марти Лейснером (Marty Leisner).
0 file_ungetc {prcc.c 997}
1 main {prcc.c 70}
2 getopt {}
3 show_all_lists {prcc.c 1070}
4 display_list {prcc.c 1056}
5 printf {}
6 exit {}
7 exit {}
9 usage {prcc.c 59}
10 fprintf {}
11 exit {}
Пример информирует о том, что функция
main
вызывает (среди прочих) функцию
show_all_lists
и что
show_all_lists
в свою очередь вызывает функцию
display_list
, которая вызывает функцию
printf
.
У этой версии
cflow
есть опция
– i
, которая формирует инвертированный потоковый граф. Утилита
cflow
перечисляет для каждой
функции другие функции, вызывающие данную. Звучит не очень понятно, но на самом деле все просто. Далее приведен пример:
19 display_list {prcc.c 1056}
20 show_all_lists {prcc.c 1070}
21 exit {}
22 main {prcc.c 70}
23 show_all_lists {prcc.c 1070}
24 usage {prcc.c 59}
25 ...
74 printf {}
75 display_list {prcc.c 1056}
76 maketag {prcc.c 4 87}
77 show_all_lists {prcc.c 1070}
78 main {prcc.c 70}
79 ...
99 usage {prcc.c 59}
100 main {prcc.c 70}
В примере показано, что функцию
exit
, например, вызывают функции
main
,
show_all_lists
и
usage
.
Выполнение профилирования с помощью prof/gprof
Методика, зачастую полезная при попытках выяснить проблемы снижения производительности программы, называется профилированием выполнения (execution profiling). Профиль программы, обычно поддерживаемый специальными опциями компилятора и вспомогательными программами, показывает, где программа тратит время.
Программа
prof
(и ее эквивалент в проекте GNU,
gprof
) выводит отчёт из файла трассировки выполнения, который формируется во время выполнения профилируемой программы. Профилируемый исполняемый файл создается с помощью флага компилятора
– p
(для
prof
) или флага
– pg
(для
gprof
).
$ cc -pg -о program program.с
Программа компонуется со специальной библиотекой С, и в нее включается контрольный код. В конкретных системах он может отличаться, но общая цель — такая организация программы, которая позволяет часто прерывать выполнение и записывать этап выполнения. Контрольные данные записываются в файл mon.out (gmon.out для
gprof
) в текущем каталоге.
$ ./program
$ ls -ls
2 -rw-r--r-- 1 neil users 1294 Feb 4 11:48 gmon.out
Программа prof/gprof читает эти контрольные данные и выводит отчет. См. подробности, касающиеся опций программы, в интерактивном справочном руководстве. Далее в качестве примера приведен вывод (сокращенный) программы gprof.