【Linux strace命令介绍】

文章目录


前言

在 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 表示执行 lsopenat 打开当前目录;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 默认会打印信号如 SIGCHLDSIGSEGV 等。可以通过输出观察是否是信号导致进程异常退出。

打印文件描述符到文件名的映射

bash 复制代码
strace -y -o /tmp/trace.strace ./prog

说明-y 会在涉及 fd(如 read(3,...))时尝试显示其对应的路径(如果可用),便于理解哪些 fd 正在操作。

打印用户态回溯(若支持)

bash 复制代码
strace -k -o /tmp/trace.strace ./prog

说明-k 可以打印触发系统调用时的用户态栈回溯(需要 strace 支持并且系统有相应符号)。若看不到回溯,说明当前 strace/系统环境不支持。

相关推荐
考虑考虑12 小时前
数据库中的EXISTS
运维·数据库·后端
爱网络爱Linux12 小时前
【系列】每天一个 Linux 命令(53)startx 命令
linux·rhce·rhca·linux运维·linux命令大全·红帽认证
ZhengEnCi12 小时前
L2A-一个域名如何访问多台云服务器-子域名、路径前缀与Nginx反向代理选型指南
linux·人工智能
M78佐菲12 小时前
51单片机学习笔记:ds18b20要点整理
linux·笔记·嵌入式硬件·学习·51单片机
高亦真13 小时前
今天是学习嵌入式的第37天
linux·学习·算法
一个有温度的技术博主13 小时前
Linux 核心命令速查指南:从文件操作到系统运维
linux·服务器
小小的木头人14 小时前
Docker 环境下迁移 containerd 数据目录:从 `/var/lib/containerd` 到 `/data/containerd`
linux·docker
天远数科14 小时前
零信任架构实战:基于天远全能消金报告构建自动化信贷评估网关
运维·人工智能·架构·自动化
东城居士14 小时前
验证第一个Linux字符驱动程序
linux·嵌入式系统
网硕互联的小客服16 小时前
各个版本的Linux系统如何修改远程端口ssh端口?
linux·运维·服务器·网络