Вы даже не можете себе представить, какие системные вызовы использует такая маленькая программка:
Листинг 22.2. Файл prog.с
#include
int main() {
printf("Hello\n");
return 0;
}
Откомпилируйте эту программу (gcc -o prog prog.c
) и запустите strace:
$ strace prog
Вы увидите следующий вывод:
execve("./a.out", ["./а.out"], [/* 21 vars */]) = 0
uname((sys="Linux", node="localhost.localdomain", ...}) = 0
brk(0) = 0x80495b4
open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 7
fstat64(7, {st_mode=S_IFREG|0644, st_size=31578, ...}) = 0
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, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`u\1В4\0"..., 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\n", 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([]
--- 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
Ваша программа работает медленно? Скорее всего, причина кроется в неэффективном, медленном алгоритме. Существуют программы, позволяющие определить время работы каждой функции вашей программы и всей программы в целом. Программы такого рода называются профайлерами. В вашем дистрибутиве может присутствовать один из профайлеров gprof, prof, profiler.
Сейчас мы рассмотрим программу gprof (The GNU Profiler), позволяющую определить время работы каждой функции. Основные ключи программы представлены в таблице 22.3.
Ключи командной строки gprof Таблица 22.3
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии