首页/系统/Linux 运维命令速查/strace 跟踪系统调用
进程与作业69 条

strace 跟踪系统调用

跟踪进程与内核的交互:attach 运行中进程(-p)、跟随子进程(-f)、过滤调用(-e)、统计耗时(-T/-c),定位卡死/报错根因。

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

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 会让目标慢上数倍,还可能改变并发时序。生产附加要限时,调试结束让进程正常继续,不要直接杀掉被追踪的进程。

易错点

  • 附着别人的进程被拒是内核 ptrace 限制,不是命令写错,需要 root 或调整内核参数
  • 不落盘也不过滤会把终端刷爆,输出还可能被截断丢掉关键行
  • 默认字符串长度有限,要看完整参数得加 -s,否则只能看到半截路径
  • 在生产长时间追踪会明显拖慢业务,还可能改变时序引发偶发问题
  • 静态编译的程序或内核内部行为 strace 看不到,要换 perf、bpftrace 一类工具

数据来源与参考

  • man 1 strace(strace 官方手册)

相关工具

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