strace 是 Linux 下直接有效的系统调用跟踪工具,可实时捕获调用参数、返回值及错误码,用于快速定位卡死、崩溃、读写失败等故障;支持附加运行中进程或启动时全程跟踪,配合 -f、-e、-s、-T、-y 等选项提升排查效率。

strace 是 Linux 下最直接、最有效的系统调用跟踪工具,能实时捕获进程执行过程中发起的所有系统调用及其参数、返回值和错误码。当程序出现“卡死”“崩溃”“读写失败”“权限拒绝”或“找不到文件”等现象,而日志又不明确时,strace 往往能一眼定位根本原因——比如打开某个配置文件失败、连接特定端口被拒绝、等待不存在的信号量、或陷入无限 poll/select 循环。
快速启动:跟踪正在运行的进程
无需重启程序,可直接附加到已有进程:
- 先用
ps aux | grep 程序名或pidof 程序名获取 PID - 执行
strace -p PID查看实时系统调用流(按 Ctrl+C 停止) - 加
-e trace=openat,open,read,write,connect,close可聚焦关键调用,减少干扰 - 加
-s 256显示更长的字符串参数(默认只截取 32 字符)
精准复现:启动时全程跟踪新进程
对启动即出错的程序(如服务无法初始化),推荐从源头跟踪:
strace -f -o trace.log ./myapp --config /etc/myapp.conf-
-f跟踪子进程(重要!尤其涉及 fork/exec 的服务) -
-o trace.log将输出保存到文件,便于搜索和分析 - 运行后立即查看 log:用
grep -E "(ENO|EACCES|ENOT|ECONN)" trace.log快速筛选错误
识别典型故障模式
观察 strace 输出时,重点关注以下线索:
-
openat(AT_FDCWD, "/etc/myapp.conf", O_RDONLY) = -1 ENOENT (No such file or directory)→ 配置路径错误或文件缺失 -
connect(3, {sa_family=AF_INET, sin_port=htons(6379), ...}, 16) = -1 ECONNREFUSED (Connection refused)→ 后端服务未启动或地址不对 -
read(4, "", 4096) = 0后反复出现poll(..., POLLIN, ...) = 1→ 可能已读到 EOF 却未正确处理退出逻辑 -
stat("/proc/self/fd/3", ...) = -1 EBADF (Bad file descriptor)→ 文件描述符已被关闭却继续使用
进阶技巧提升排查效率
避免信息过载,让 strace 输出更有针对性:
- 用
-T显示每次系统调用耗时,快速发现性能瓶颈(如某次open耗时 3 秒,可能挂载点卡住) - 用
-y显示文件描述符对应的实际路径(如read(3</var/log/app.log>, ...)) - 用
-P /path/to/file只跟踪对指定路径的访问(适合排查文件级问题) - 结合
lsof -p PID和/proc/PID/fd/查看当前打开的资源,与 strace 对照验证
strace 不依赖源码和调试符号,也不需要重新编译程序,是生产环境快速“听诊”的首选工具。只要关注返回值、错误码和上下文调用序列,多数系统层异常都能在几分钟内水落石出。


















