Чтение онлайн

ЖАНРЫ

Основы программирования в Linux
Шрифт:

find_cat 403 appui.с static cdc_entry find_cat(

Можно перенаправить вывод в другой файл с помощью опции

– 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.

cumulative self self total

time seconds seconds calls ms/call ms/call name

18.5 0.10 0.10 8664 0.01 0.03 doscan [4]

18.5 0.20 0.10 mcount (60)

14.8 0.28 0.08 43320 0.00 0.00 _number [5]

9.3 0.33 0.05 8664 0.01 0.01 _format_arg [6]

7.4 0.37 0.04 112632 0.00 0.00 _ungetc [8]

7.4 0.41 0.04 8757 0.00 0.00 _memccpy [9]

Поделиться с друзьями: