strace 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,聚焦
strace——性能观测与调试命令族(见性能观测命令族)。它和 perf 互补:perf 看"算什么",strace 看" syscall 什么"。
strace 跟踪进程发出的系统调用(syscall,用户程序向内核请求服务的接口,如读文件、建连接、申请内存)。当程序"卡住、报错、行为怪异"又没日志时,strace 能直接看到它在内核层面到底做了什么——往往一眼就现形。
一、跟踪一个命令
strace ls # 跟踪 ls 启动到结束的所有 syscall
strace -f make # -f 同时跟踪 fork 出的子进程
strace -o out.txt grep foo file # -o 输出到文件(不然刷屏)不加参数时 strace 会打印海量系统调用,直接飙屏。必加
-o存文件,或配合-e过滤。看到满屏的openat、read、write、connect就是正常的系统调用流。
二、跟踪运行中的进程:-p
strace -p 1234 # 附着到 PID 1234
strace -fp 1234 # 连子进程一起程序已经在跑、表现异常,用
-p附着上去看它此刻在干什么。比如一个"假死"的进程,strace 里若一直停在futex(...)说明在等锁,read(...)停在说明等 IO/网络——这比猜强百倍。附着需要权限(同用户或 root)。
三、过滤与计时
strace -e trace=network curl https://x # 只看网络类 syscall
strace -e trace=file ls # 只看文件类(open/read/stat)
strace -T -p 1234 # -T 显示每个调用耗时
strace -tt -p 1234 # -tt 微秒级时间戳
strace -c ls # -c 汇总统计各类调用次数/耗时
-e trace=按类别或具体调用过滤:network(connect/sendto/recvfrom)、file(open/read/stat)、或具体如-e trace=openat,read。-T看单个调用花多久,定位"卡在哪个 syscall";-c则是汇总报表,一眼看出时间主要耗在哪类调用上。
四、常见排查场景
# 程序启动慢:看是不是卡在等某个文件/网络
strace -T -e trace=connect,openat,read ./app
# 报 "Permission denied" 但权限看着对:看它实际 open 了哪个路径
strace -e trace=file ./app 2>&1 | grep -i denied
# 进程卡死:附着看停在哪
strace -p $(pgrep myapp)"Permission denied" 却看不出为什么——strace 会打印它实际尝试
open/access的完整路径,常发现是某个你没注意的配置文件或 socket。这类问题靠读代码很难发现,strace 直接抓现行。
五、strace vs perf vs ltrace
| 工具 | 看什么 |
|---|---|
strace | 系统调用(陷内核的请求) |
| perf | CPU 热点函数 / 硬件事件(见 perf) |
ltrace | 库函数调用(用户态库,如 glibc) |
排查思路:进程 CPU 高 → perf 看算在哪;进程卡住/报错/慢但 CPU 不高 →
strace看卡在哪个 syscall(等锁、等网络、文件打不开);怀疑是某个库函数行为异常 →ltrace。三者分层,strace 专治"内核交互"类的疑难。
六、实战:定位一个启动巨慢的服务
strace -T -tt -e trace=connect,open,read,stat -o s.txt ./myservice
# 在 s.txt 里找耗时最长的行
grep -E "^[0-9]" s.txt | sort -t'<' -k2 -rn | head若发现某个 connect(...) 到某 IP 花费数秒、或反复 open 一个不存在的文件触发重试,就是根因——比如硬编码了一个不可达的监控地址,每次启动卡几秒。这类问题从日志根本看不出,strace 直接抓到 syscall 级证据。系统调用内部机制见 进程/系统调用原理。
一句话总结
strace = 跟踪进程的系统调用:-p 附着运行中的进程看它此刻在干啥、-f 跟子进程、-e trace=file/network 过滤、-T 看单调用耗时、-c 汇总统计;"卡在 futex"=等锁、"停在 read"=等 IO、"Permission denied"看实际 open 路径。CPU 高用 perf,卡顿/报错/慢用 strace,专治内核交互类疑难。