# strace - какие syscall'ы делает процесс _Команды · LinuxLab Knowledge Base_ **TL;DR:** `strace` показывает в реальном времени какие системные вызовы делает процесс и с какими аргументами. Главный инструмент когда «процесс молчит». ## Когда применять - Процесс «висит» - на каком syscall'е застрял? - Не открывается файл - какой именно путь и с какой ошибкой? - Сетевой клиент тормозит - куда коннектится и сколько ждёт? - Сравнить два бинаря - почему один быстрее? Под капотом - `ptrace(2)`. На многих системах нужен capability `SYS_PTRACE` или `ptrace_scope=0` в sysctl. ## Базовые формы ```bash strace ls /tmp # запустить ls под strace strace -p 1234 # подключиться к существующему [process-and-pid](/kb/process-and-pid.md) strace -f -p 1234 # -f: следовать в дочерние процессы strace -c ls /tmp # -c: только сводка (count + total time на syscall) ``` ## Фильтры ```bash 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'ов (без `-f` strace следит только за родителем) ## Типичный вывод ``` 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 Сводка выявляет «где тратится время»: ```bash 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'е без правильных привилегий ## Команды ```bash strace -c ls /tmp ``` Сводка syscall'ов команды: что чаще всего делается ```bash sudo strace -p $(pgrep -x nginx) -e trace=network ``` Только сетевые syscall'ы живого процесса ```bash strace -f -tt -o trace.log ./app ``` Детальный лог всех syscall'ов в файл, с дочерними процессами ```bash strace -y -e trace=file ls 2>&1 | head ``` Файловые syscall'ы с расшифровкой fd → имени файла ```bash strace -e fault=openat:error=ENOENT ls /tmp ``` Эмулировать сбой syscall'а - для тестирования error-handling ## См. также - [ps - снимок процессов](/kb/cmd-ps.md) - [htop - интерактивный монитор процессов](/kb/cmd-htop.md) - [lsof - кто что открыл](/kb/cmd-lsof.md) - [Сигналы (SIGTERM, SIGKILL, SIGHUP)](/kb/signals.md) - [BPF CO-RE - Compile Once Run Everywhere](/kb/bpf-co-re.md)