old_mmap(NULL, 31578, PROT_READ, MAP_PRIVATE, 7, 0) = 0x40014000

close(7) = 0

open('/lib/i686/libc.so.6', O_RDONLY) =7

read(7, '177ELF111331`u1В4'..., 1024) = 1024

fstat64(7, {st_mode=S_IFREG|0755, st_size=1401027, ...}) = 0

old_mmap(0x42000000, 1264928, PROT_READ|PROT_EXEC, MAP_PRIVATE, 7, 0) = 0x42000000

mprotect(0x4212c000, 36128, PROT_NONE) = 0

old_mmap(0x4212c000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 7, 0x12c000) = 0x4212c000

old_mmap(0x42131000, 15648, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED| MAP_ANONYMOUS, -1, 0) = 0x42131000

close(7) = 0

munmap(0x40014000, 31578) = 0

brk(0) = 0x80495b4

brk(0x80495e4) = 0x80495e4

brk(0x804a000) = 0x804a000

fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0

mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40014000

write(1, 'Hello ', 6) =6

munmap(0x40014000, 4096) = 0

_exit(0) = ?

Читать вызовы нужно так:

имя системного вызова = возвращаемое значение

В нашем случае мы вывели на консоль шесть символов, поэтому вызов write() возвратит значение 6.

В случае, если системный вызов завершился неудачно (обычно код ошибки -1), программа strace выводит не только код, но и описание ошибки:

open('/foo/bar', O_RDONLY) = -1 ENOENT (No such file or directory)

Стандартные константы выводятся в их символьном представлении:

open('file.dat', O_WRONLY|O_APPEND|O_CREAT, 0666) = 3

Сигналы также выводятся в символьном представлении, например:

sigsuspend([] <unfinished ...>

--- SIGINT (Interrupt) ---

+++ killed by SIGINT +++

Структуры, точнее члены структур, заключаются в фигурные скобки и выводятся в формате имя_члена=значение, например:

lstat('/dev/null', {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) =0

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

read(3, 'root::0:0:System Administrator:/'..., 1024) = 422

22.5. Оптимизация программ. Профайлер gprof

Ваша программа работает медленно? Скорее всего, причина кроется в неэффективном, медленном алгоритме. Существуют программы, позволяющие определить время работы каждой функции вашей программы и всей программы в целом. Программы такого рода называются профайлерами. В вашем дистрибутиве может присутствовать один из профайлеров gprof, prof, profiler.

Сейчас мы рассмотрим программу gprof (The GNU Profiler), позволяющую определить время работы каждой функции. Основные ключи программы представлены в таблице 22.3.

Ключи командной строки gprof Таблица 22.3

Ключ Назначение
He выводить информацию о статических функциях
-b Не выводить описание каждого поля в итоговой таблице
Включить эвристический анализ текстового сегмента объектного файла с целью создания статического графика вызовов
-e имя_функции На выводить отчет о работе указанной функции и обо всех функциях, которые из нее вызываются
-E имя функции Не обрабатывать указанную функцию и все функции, которые она вызывает
-f имя_функции выводить информацию только об указанной функции и обо всех функциях, которые из нее вызываются
-F имя_функции Обрабатывать только указанную функцию и все функции, которые из нее вызываются
-k func1 func2 Не выводить информацию о вызове функции func2 из функции func1
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

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

Отметить Добавить цитату