strace命令详解
strace
是 Linux 系统中最常用的 系统调用跟踪工具,它通过监控进程与内核的交互(如文件操作、网络通信、进程管理等)来帮助调试程序行为。以下是 strace
的详细指南:
一、核心功能
- 跟踪系统调用
记录进程执行期间调用的所有系统函数(如open
、read
、write
、execve
等)。 - 信号捕获
显示进程接收到的信号(如SIGSEGV
、SIGTERM
)。 - 性能分析
统计系统调用的耗时,定位性能瓶颈。
二、基本用法
1. 跟踪已有进程
strace -p <PID> # 跟踪指定进程
strace -p <PID> -f # 跟踪进程及其子进程
2. 启动新进程并跟踪
strace <command> # 跟踪命令执行(如 strace ls)
strace -o output.txt <command> # 输出到文件
3. 常用选项
选项 | 说明 |
---|---|
-e trace=<syscalls> | 仅跟踪指定系统调用(如 -e trace=open,read ) |
-e signal=<signals> | 仅捕获指定信号(如 -e signal=SIGSEGV ) |
-s <size> | 显示字符串的最大长度(默认32字节) |
-c | 统计系统调用耗时汇总 |
-y | 显示文件描述符对应的实际路径 |
-tt | 显示时间戳(微秒级) |
三、典型使用场景
1. 调试程序崩溃
strace -f -e trace=open,read,write ./my_program
通过观察崩溃前的最后一个系统调用,定位文件或权限问题。
2. 分析性能问题
strace -c -p <PID> # 统计系统调用耗时
输出示例:
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
62.34 0.123456 234 527 12 open
28.91 0.057890 189 306 4 read
8.75 0.017543 256 68 write
3. 跟踪文件访问
strace -e trace=file ls # 仅跟踪文件相关调用
输出关键信息:
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
4. 网络通信分析
strace -e trace=network nc google.com 80
输出关键网络调用:
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("142.250.66.14")}, 16) = 0
四、高级技巧
1. 过滤输出
strace -e 'trace=!epoll_wait' <command> # 排除特定系统调用
2. 显示文件描述符路径
strace -y -e trace=open,read,write <command>
输出示例:
openat(AT_FDCWD, "/etc/passwd", O_RDONLY) = 3</etc/passwd>
read(3</etc/passwd>, "root:x:0:0:root:/root:/bin/bash\n", 4096) = 145
3. 跟踪进程初始化
strace -E LD_DEBUG=all <command> # 结合动态链接器调试
4. 实时监控
strace -p <PID> -s 1024 -y -tt 2>&1 | grep "read("
五、注意事项
- 性能影响
strace
会使程序运行速度显著下降(10倍以上),避免在生产环境长期使用。 - 权限要求
跟踪其他用户的进程需要root
权限。 - 安全风险
可能暴露敏感信息(如密码明文),调试后及时清理日志。
六、替代工具
- ltrace:跟踪动态库函数调用(如
printf
、malloc
)。 - perf:更高效的系统级性能分析。
- bpftrace:基于 eBPF 的高级跟踪工具。