strace 是 Linux 下用于跟踪系统调用的工具,支持跟踪新进程、附加已有进程、筛选调用类型、记录耗时及输出重定向,广泛用于调试、权限排查与性能分析。

strace 是 Linux 下最常用的系统调用跟踪工具,能实时显示进程执行过程中发起的所有系统调用及其参数、返回值和错误信息,对调试程序行为、排查权限问题、分析性能瓶颈非常有用。
基本用法:直接跟踪新启动的命令
最简单的方式是把 strace 放在要运行的命令前面:
- strace ls /tmp —— 跟踪 ls 命令的全部系统调用
- strace -o log.txt ping -c 1 google.com —— 将输出保存到 log.txt 文件中
- strace -f curl http://example.com —— 加 -f 跟踪子进程(如 fork 出的线程或子命令)
附加到已有进程:诊断正在运行的程序
用 -p 参数指定进程 PID,无需重启服务:
- ps aux | grep nginx —— 先查出目标进程 PID(比如 1234)
- strace -p 1234 —— 实时打印该进程的系统调用
- strace -p 1234 -e trace=open,read,write —— 只关注特定调用,减少干扰
筛选与精简输出:聚焦关键信息
默认输出非常冗长,常用过滤方式包括:
- -e trace=connect,sendto,recvfrom —— 仅跟踪网络相关系统调用
- -e trace=!mmap,mprotect —— 排除内存映射类调用(常用于过滤噪音)
- -s 256 —— 增大字符串参数显示长度(默认只显示前 32 字符)
- -T —— 显示每次系统调用耗时(单位微秒),便于定位慢操作
常见场景与实用技巧
遇到问题时,strace 往往比看日志更快定位根源:
- 程序报 “Permission denied”?用 strace -e trace=openat,open 看它试图打开哪个文件、是否路径错误或权限不足
- 程序卡住无响应?加 -p PID -T 观察最后几个调用是否长时间阻塞(如 read() 或 recv())
- 配置不生效?检查是否读错了配置路径:strace -e trace=openat 2>&1 | grep conf
- 想确认程序是否真的访问了某设备或 socket?strace -e trace=ioctl,socket,bind 可验证底层行为


















