strace 是 linux 下用于跟踪系统调用的工具,可实时显示调用参数、返回值及错误;支持跟踪新进程、附加已有进程、过滤调用类型、显示耗时与时间戳,并需注意权限、性能影响及路径解析等细节。

strace 是 Linux 下最常用的系统调用跟踪工具,能实时显示进程执行过程中调用的每一个系统调用(如 open、read、write、connect 等)及其参数、返回值和错误信息,对排查程序卡顿、文件访问失败、网络连接异常等问题非常有效。
基本用法:直接跟踪新启动的命令
在命令前加上 strace 即可跟踪其整个生命周期:
-
strace ls /tmp—— 跟踪ls命令的系统调用 -
strace -f curl https://example.com—— 加-f跟踪子进程(如curl的 DNS 解析线程) -
strace -e trace=open,read,write ./myapp—— 只关注指定的几个系统调用,减少干扰
附加到已有进程:诊断正在运行的服务
用 -p 参数绑定到目标进程 PID,无需重启服务:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 先查 PID:
ps aux | grep nginx或pidof nginx - 再跟踪:
strace -p 1234 -s 1024 -o nginx.log
其中-s 1024扩展字符串显示长度(默认 32 字节,太短会截断路径或错误信息),-o将输出保存到文件 - 按
Ctrl+C可随时停止跟踪(日志已落盘)
过滤与精简输出:快速定位关键信息
默认输出非常冗长,合理使用选项能大幅提升效率:
-
-e trace=network—— 只跟踪网络相关调用(socket、connect、sendto等) -
-e trace=!rt—— 排除实时信号相关调用(减少噪音) -
-T—— 显示每次系统调用耗时(单位秒),便于发现慢调用 -
-t或-tt—— 添加时间戳(精确到微秒),方便关联其他日志 -
2>&1 | grep -E "(EACCES|ENOENT|ECONNREFUSED)"—— 实时过滤常见错误
常见问题与实用技巧
实际使用中注意这些细节:
- 权限问题:跟踪非自身进程需 root 权限(或具备
CAP_SYS_PTRACE能力),普通用户只能跟踪自己启动的进程 - 性能影响:strace 会显著拖慢被跟踪进程(尤其高频率调用场景),生产环境慎用,建议先在测试环境复现
- 符号无法解析?加
-y可显示文件描述符对应的路径(如read(3, ...)→read(3)) - 想看调用栈?strace 本身不支持,可配合
gdb -p PID或pstack补充分析










