首页/系统/Linux 运维命令速查/strace 跟踪系统调用定位故障

strace 跟踪系统调用定位故障

strace 观察进程与内核的交互:卡在哪、报了哪个错误号、读写了什么文件;排查启动失败与性能卡顿的终极放大镜。

Linux 运维命令速查系统更新于 2026-10-13

strace 是什么

strace 跟踪进程与内核之间的交互:它看到的是系统调用与信号,也就是程序真正向内核提出的请求。程序卡在哪、报的是哪个错误号、打开了哪些文件、连了哪个地址,都能从跟踪结果里读出来。它特别适合两类场景:程序启动即刻失败(错误号直接指向缺文件或权限不足),以及运行中卡顿但日志里看不出原因。

基本信息

用途跟踪进程的系统调用与信号,定位失败原因与阻塞点
语法strace [选项] 命令;或 strace -p PID 附加到运行中的进程
所属软件包strace(部分最小化镜像需单独安装)
常用选项-f 跟随子进程与线程、-tt 绝对时间戳、-T 每个调用耗时、-c 汇总统计、-o 输出到文件、-e 过滤调用类别、-y 显示文件描述符指向的路径

典型使用场景

  • 启动失败排查:程序一启动就退出,跟踪结果里的错误号直接指出缺哪个文件或哪种权限
  • 连接问题定位:看它到底连了哪个地址与端口,区分是解析错、连错地址还是被拒绝
  • 卡顿分析:配合耗时统计找出哪个调用一直不返回
  • 容器内溯源:进程在容器里行为异常,用 strace 看清实际读写路径
  • 安全复核:观察进程有没有读取预期之外的文件或建立外联

常用示例

常用示例
strace -f -tt -e trace=openat,connect ./start.sh 2>&1 | tail -n 40
strace -f -o /tmp/trace.log ./run.sh && grep -n 'EACCES' /tmp/trace.log | head
strace -c -p $(pgrep -f app.jar | head -1)          # 只看调用次数与耗时汇总
strace -f -yy -e trace=network ./client 2>&1 | head # 网络类调用,附带描述符指向
strace -e trace=file -T -f ./deploy.sh 2>&1 | grep -E 'ENOENT|EACCES' | head

常用选项对照

选项作用使用建议
-f跟随子进程与线程多进程程序必须加,否则只看到父进程
-tt打印绝对时间戳与其他日志做时间对齐时必备
-T显示每个调用的耗时定位「卡在哪个调用」最直接
-c输出汇总统计快速看调用分布与总耗时占比
-o 文件结果写入文件输出量大时先落盘再分析
-e trace=按调用类别过滤缩小范围,显著减小输出体积
-y显示描述符对应的路径判断到底在读写哪个文件

常见错误号含义

错误号含义排查方向
ENOENT文件或路径不存在检查配置里的路径、工作目录与相对路径
EACCES权限不足看属主、权限位以及安全模块策略
ECONNREFUSED对端拒绝连接目标端口没有监听或被规则拒绝
ETIMEDOUT连接超时中间链路拦截或对端未响应
EMFILE打开文件数超过上限调整单元与应用的句柄上限
EAGAIN资源暂时不可用非阻塞模型下的正常返回,需结合上下文判断
容器里做跟踪需要相应的能力与内核参数支持:没有权限时会直接报错。改用应用自身日志、/proc 下的运行时信息,或直接把跟踪放到宿主侧进行,都是可行的替代路径。
strace 会显著拖慢被跟踪进程,高流量服务上长时间附加可能引发超时甚至雪崩。优先短时抓取、加过滤条件,或在预发环境复现问题。

易错点

  • 输出不加过滤直接看:多线程程序会产生海量调用,先按类别过滤或直接写入文件再分析
  • 在生产高流量进程上长时间附加:跟踪开销会传导到业务,短时采样加过滤是更稳妥的做法
  • 只看错误号不看上下文:同一个错误号在不同阶段意义不同,要结合前后调用判断
  • 把容器的跟踪失败当成进程异常:多数是权限或内核参数限制,先确认能否跟踪再讨论程序行为

数据来源与参考

  • man 1 strace
  • strace 官方文档

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌