【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 表示执行 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/系统环境不支持。

相关推荐
在角落发呆4 小时前
工具配置备份步骤:从手动备份到自动化方案
运维·windows·自动化
_upupup5 小时前
Linux的调试工具——gdb/cgdb
linux·服务器
百度一下吧5 小时前
Nginx 使用手册:从安装配置到实战部署
运维·nginx
JeJe同学5 小时前
Docker镜像导入、容器启动
linux·运维·docker
Jason_zhao_MR5 小时前
Linux与实时控制如何兼得
linux·嵌入式硬件·机器人·工业控制
回眸&啤酒鸭5 小时前
【回眸】自动化白盒测试落地实战指南
运维·自动化·log4j
闲云野鹤在人间6 小时前
MySQL|从理论、安装、备份到主从复制、MHA高可用详解
linux·运维·数据库·mysql·云计算
一个风轻云淡7 小时前
GCC 和 GDB命令简单解读
java·linux·前端
H.莓飛7 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
资料库017 小时前
Linux 8个常见运维故障排查
java·linux·运维