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 会显著拖慢被跟踪进程,高流量服务上长时间附加可能引发超时甚至雪崩。优先短时抓取、加过滤条件,或在预发环境复现问题。