文章目录
- 前言
- [一、strace 是什么?](#一、strace 是什么?)
- 二、安装
- 三、常用选项速览
- 四、示例
-
- [1. 跟踪一个命令](#1. 跟踪一个命令)
- [2. 只跟踪文件相关的系统调用](#2. 只跟踪文件相关的系统调用)
- [3. 将输出写到文件(推荐)](#3. 将输出写到文件(推荐))
- [4. 显示更长的字符串参数](#4. 显示更长的字符串参数)
- 五、高级用法
前言
在 Linux 上排查程序问题时,系统调用(syscall)是程序与内核交互的关键接口。strace 用于拦截并记录进程执行时的系统调用及其参数、返回值和耗时。
一、strace 是什么?
strace 是 Linux 下用于跟踪系统调用(system calls)和信号(signals)的工具。它通过 ptrace 或类似机制附加到进程,记录该进程发出的系统调用及相关信息(参数、返回值、耗时、错误码等)。对调试、性能诊断、安全审计都非常有用。
二、安装
bash
# Debian/Ubuntu
sudo apt update
sudo apt install strace
# CentOS / RHEL / Fedora
sudo yum install strace
# 或
sudo dnf install strace
# MacOS(不等价功能,macOS 下常用 dtruss / dtrace)
brew install strace # 注意:macOS 上的 strace 功能有限或不可用
查看版本与帮助:
bash
strace -V
strace --help
三、常用选项速览
strace command [args...]:运行并跟踪一个新进程(最常用)。strace -p PID:附加到正在运行的进程。-f:跟踪 fork/exec 出来的子进程。-o FILE:把输出写到文件(避免控制台混乱)。-e trace=...:过滤要跟踪的系统调用(例如file,network,process,或具体的open,read,write,connect)。-s SIZE:显示字符串参数时的最大长度(默认 32),增加可看到完整路径或内容。-c:统计模式,显示各系统调用的耗时与次数汇总。-tt/-ttt:打印微秒/秒级别时间戳。-T:显示每次系统调用的耗时。-k:在支持的系统上打印用户态回溯(stack trace),视 strace 编译时是否启用了 libunwind 等支持。-y:打印文件描述符对应的文件名(有助于理解 fd 操作)。-D:以守护进程方式运行(少见)。
四、示例
1. 跟踪一个命令
bash
strace ls
说明:这会把大量系统调用打印到标准错误。常见输出片段:
execve("/bin/ls", ["ls"], 0x7ffd...) = 0
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
getdents64(3, /* 返还目录项 */) = 224
write(1, "file1\n", 6) = 6
exit_group(0) = ?
解析 :execve 表示执行 ls;openat 打开当前目录;getdents64 读取目录项;write 将结果输出到 stdout。
2. 只跟踪文件相关的系统调用
bash
strace -e trace=file ls /etc
说明 :-e trace=file 会跟踪与文件操作相关的系统调用(open, stat, access 等),更容易看出程序访问了哪些文件。
3. 将输出写到文件(推荐)
bash
strace -o /tmp/ls.strace ls /etc
# 查看文件
less /tmp/ls.strace
4. 显示更长的字符串参数
bash
strace -s 256 some_program
说明 :当路径或字符串参数较长时,将 -s 设置为更大的值,可以看到完整内容。
五、高级用法
跟踪子进程(fork/clone/exec)
bash
strace -f -o /tmp/all.strace ./your_program
说明 :-f 会跟踪由程序产生的子进程(常用于服务器、脚本中间会 spawn 子进程的情形)。
附加到正在运行的进程
bash
# 以 root 或目标进程所有者运行
strace -p 12345 -o /tmp/attach.strace
# 可用 -f 一并跟踪子进程
strace -f -p 12345
按系统调用过滤
bash
# 只跟踪 open/read/write/connect/accept
strace -e trace=open,read,write,connect,accept -o /tmp/trace.strace ./prog
# 或按类别:
strace -e trace=file ./prog # 文件相关
strace -e trace=network ./prog # 网络相关(connect, sendto, recvfrom...)
捕获信号
strace 默认会打印信号如 SIGCHLD、SIGSEGV 等。可以通过输出观察是否是信号导致进程异常退出。
打印文件描述符到文件名的映射
bash
strace -y -o /tmp/trace.strace ./prog
说明 :-y 会在涉及 fd(如 read(3,...))时尝试显示其对应的路径(如果可用),便于理解哪些 fd 正在操作。
打印用户态回溯(若支持)
bash
strace -k -o /tmp/trace.strace ./prog
说明 :-k 可以打印触发系统调用时的用户态栈回溯(需要 strace 支持并且系统有相应符号)。若看不到回溯,说明当前 strace/系统环境不支持。