strace 是什么
strace 跟踪进程与内核之间的系统调用:它附着到目标进程,把每次打开文件、读写、建立连接的动作连同返回值都记下来。进程卡住、启动就失败、报权限错却看不出原因时,看它到底在向内核要什么,往往比读应用日志更快找到答案。代价是附加追踪会显著拖慢目标,生产上必须限时并缩小范围。
基本信息
| 适用平台 | Linux;部分精简系统需要单独安装 |
|---|---|
| 命令语法 | strace [选项] 命令 ;strace [选项] -p PID |
| 常用选项 | -f 跟随子进程 / -e trace=类别 过滤 / -o 文件 落盘 / -T 显示每次耗时 / -t 加时间戳 / -c 汇总统计 / -s 设置字符串长度 |
| 权限要求 | 追踪他人进程需要 root,或内核 ptrace 范围放宽 |
典型使用场景
- 进程启动即失败:看它在哪个打开文件或连接动作上返回错误
- 服务卡死无响应:附着几秒,看它挂在哪个调用上
- 权限问题定位:看被拒绝访问的具体路径是什么
- 性能疑点:用 -c 统计各类调用的次数与耗时占比
- 确认真实行为:配置到底读了哪个文件,连的是哪个地址
常用示例
常用示例
strace -f -p 1234 -o /tmp/tr.log # 附着并落盘,看几秒后 Ctrl+C
strace -e trace=openat,stat ./app # 只看文件相关调用
strace -c ./app # 调用次数与耗时汇总
strace -T -e trace=network -p 1234 # 网络调用并显示每次耗时
strace -s 256 -e trace=execve ./app # 看执行参数,拉长字符串显示
strace -f -tt -e trace=connect -o c.log ./app # 带时间戳追踪连接常用选项
| 选项 | 作用 | 提示 |
|---|---|---|
| -f | 跟随 fork 出来的子进程 | 多进程服务必须加 |
| -e trace= | 只追踪指定类别的调用 | openat、network、read,write |
| -o 文件 | 输出写到文件 | 避免刷爆终端 |
| -T | 每次调用后显示耗时 | 用来找慢在哪一步 |
| -t / -tt | 每行前加时间戳 | 格式化时间线 |
| -c | 结束时给统计汇总 | 快速看调用分布 |
| -s N | 字符串最大显示长度 | 默认过短会截断参数 |
输出量极大,务必用 -o 落盘并限定类别;不限范围地附着到繁忙服务,日志文件几秒钟就能涨到几百 MB。
strace 会让目标慢上数倍,还可能改变并发时序。生产附加要限时,调试结束让进程正常继续,不要直接杀掉被追踪的进程。