Когда применять
- Процесс «висит» - на каком syscall'е застрял?
- Не открывается файл - какой именно путь и с какой ошибкой?
- Сетевой клиент тормозит - куда коннектится и сколько ждёт?
- Сравнить два бинаря - почему один быстрее?
Под капотом - ptrace(2). На многих системах нужен capability SYS_PTRACE
или ptrace_scope=0 в sysctl.
Базовые формы
strace ls /tmp # запустить ls под strace
strace -p 1234 # подключиться к существующему [[process-and-pid]]
strace -f -p 1234 # -f: следовать в дочерние процессы
strace -c ls /tmp # -c: только сводка (count + total time на syscall)
Фильтры
strace -e trace=openat ls # только openat()
strace -e trace=network curl URL # только сетевые: connect, sendto, recvfrom...
strace -e trace=file ls # все file-related: open, stat, access, read...
strace -e trace=!futex,clock_gettime ls # ! = ИСКЛЮЧИТЬ шумные
Полезные флаги
-t/-tt/-ttt- таймстемпы (нарастающая точность)-T- длительность каждого syscall'а в скобках после возврата-y- расшифровывать file descriptor'ы в имена файлов-yy- то же + типы сокетов-s 256- длиннее показывать строки в аргументах (default 32)-o file.log- писать в файл вместо stderr-f- следовать в child'ов (без-fstrace следит только за родителем)
Типичный вывод
openat(AT_FDCWD, "/etc/passwd", O_RDONLY) = 3
read(3, "root:x:0:0:root:/root:/bin/bash\n"..., 4096) = 1234
close(3) = 0
Если syscall завершился ошибкой - это видно сразу:
openat(AT_FDCWD, "/no-such", O_RDONLY) = -1 ENOENT (No such file or directory)
strace -c для performance
Сводка выявляет «где тратится время»:
strace -c -p $(pgrep -x app) -- sleep 10
▸таблица: syscall / % time / total / calls / errors
▸если 80% времени в epoll_wait - приложение ждёт I/O, всё ок
▸если 80% в futex - конкурируют локи, искать contention
Ограничения
- Tracing замедляет процесс в 10-100x. Не использовать на проде долго.
- Не показывает kernel-level (что внутри ядра между sys_enter и sys_exit) -
для этого
bpftrace/perf trace - Не видит процессы в другом PID-namespace'е без правильных привилегий