strace是Linux下用于追踪进程系统调用的调试工具,可显示调用名、参数、返回值、耗时等信息,支持跟踪新启动命令或附加到运行中进程(-p)、包含子进程(-f)、按类别过滤(-e trace=file/network)、保存带时间戳的完整日志(-o -tt -T -s)。

直接用 strace 就能看清进程在内核里干了什么——它不是看代码,而是看程序真正调用了哪些系统函数、传了什么参数、返回了什么结果、花了多少时间。
跟踪刚启动的命令
适合调试短命命令,比如 ls、curl 或自定义脚本:
- 运行
strace ls /tmp,会看到从execve开始的完整调用链 - 每行格式统一:
系统调用名(参数...) = 返回值,例如openat(AT_FDCWD, "/tmp", O_RDONLY) = 3 - 按
Ctrl+C可中止目标命令和跟踪
附加到正在运行的进程
不用重启服务,实时观察后台进程(如 nginx、redis、java 应用)的行为:
- 先查 PID:
pgrep nginx或pidof mysqld - 再 attach:
strace -p 12345 - 要连子进程一起跟(比如 fork 出的 worker),加
-f:strace -f -p 12345 - 如果终端卡住不动,可能是目标进程处于 D 状态(如磁盘等待),可用
ps -o pid,stat,comm -p 12345确认
聚焦关键调用,避免信息过载
默认输出太全,容易淹没重点。必须主动过滤:
- 只看文件操作:
strace -e trace=file -p 12345(涵盖openat、statx、read等) - 只看网络行为:
strace -e trace=network -p 12345(含connect、sendto、accept4) - 只显示失败调用(返回
-1):strace -z -e trace=connect,openat -p 12345 - 注意:
-e trace=file,network是合法写法,逗号分隔即可,不是叠加失效
保存结果并增强可读性
终端滚动太快?需要复盘或分享给同事?把输出存下来:
- 保存到文件:
strace -o /tmp/trace.log -s 256 -T -p 12345
-s 256 防止路径或 header 被截断;-T 显示每次调用耗时 - 加时间戳方便对齐其他日志:
strace -tt -o /tmp/trace.log -p 12345 - 用
-y显示 fd 对应的真实路径,例如read(3→read(3/nginx/nginx.conf>) - 别用
2>&1 > file重定向——会丢 stderr 中的关键错误,必须用-o











