Вики / Процессы
strace (трейс системных вызовов)
Что процесс делает на самом деле — файлы, сеть, ошибки системных вызовов.
strace показывает системные вызовы процесса (открытие файлов, сеть, чтение/запись)
и их результат. Незаменим, когда «непонятно, почему не работает»: видно, какой файл
не найден, куда не достучался, где Permission denied. (Для вызовов библиотек —
ltrace.)
strace command args # трейс запуска команды
sudo strace -p 1234 # подключиться к работающему процессу
| Ключ | Значение |
|---|---|
-f |
следовать за дочерними процессами/потоками |
-p PID |
подключиться к работающему процессу |
-e trace=... |
фильтр: file, network, openat,read, %memory |
-c |
сводка-профиль (какие вызовы, сколько времени) |
-T |
время на каждый вызов |
-t / -tt |
таймстамп каждой строки |
-y |
показывать пути/адреса вместо номеров fd |
-s N |
длина показываемых строк (по умолч. 32 — увеличь) |
-o FILE |
вывод в файл |
strace -f -e trace=file cmd # файловые операции с дочерними
strace -e trace=network -f cmd # сетевые вызовы (connect/sendto)
strace -y -e trace=read,write -p PID # что читает/пишет процесс, с путями fd
strace -T -e trace=openat cmd # время каждого openat
strace -c cmd # ПРОФИЛЬ: топ вызовов по времени/числу
strace -s 200 -e trace=write -p PID # увидеть длинные строки вывода
strace -tt -o trace.log -f cmd # в файл, с таймстампами, с потомками
Программа падает/висит без понятной причины
strace -f program → смотри последние вызовы перед зависанием/выходом. Часто видно
openat(...«файл») = -1 ENOENT (нет файла) или connect(...) = ... ETIMEDOUT.
«Permission denied», но непонятно на чём
strace -f -e trace=file program 2>&1 | grep EACCES — покажет, к какому файлу нет
доступа (см. chmod-chown, permissions).
Куда лезет процесс по сети
strace -f -e trace=network program — увидишь connect() к адресам/портам
(дополни tcpdump для самих пакетов).
Процесс завис — на чём именно
sudo strace -p PID — последний вызов и есть «место зависания» (часто read/futex/
poll). Состояние D — ждёт I/O (см. processes).
strace: Operation not permitted
Нужен root для чужого процесса (sudo), либо ограничение yama
(/proc/sys/kernel/yama/ptrace_scope = 1).
strace -f cmd # трейс с дочерними
sudo strace -p PID # к работающему процессу
strace -f -e trace=file cmd # только файлы (ENOENT/EACCES)
strace -e trace=network cmd # сеть
strace -c cmd # профиль вызовов
strace -y -s200 -p PID # с путями fd и длинными строками
См. также
- Процессы (ps, top, kill, nice) — Процессы
- lsof (открытые файлы и порты) — Процессы