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

相关推荐
请为小H留灯1 小时前
Docker 命令速通指南:从入门到封神的 100 + 必学指令,一篇搞定容器全操作
运维·docker·容器
一只鹿鹿鹿1 小时前
数据治理文档(word原件)
java·运维·spring boot·后端
『往事』&白驹过隙;1 小时前
Linux VFS虚拟文件系统杂谈
linux·c语言·arm开发·物联网·操作系统·iot
暴力求解1 小时前
Linux--进程(七)环境变量
linux·运维·服务器
济6172 小时前
ARM Linux 驱动开发篇---Linux设备树特殊节点及linux内核解析dtb文件过程--- Ubuntu20.04
linux·嵌入式·嵌入式linux驱动开发
Doro再努力2 小时前
【Linux操作系统14】操作系统概念与管理思想深度解析
linux·运维·服务器
Trouvaille ~2 小时前
【Linux】poll 多路转接:select 的改良版,以及它留下的遗憾
linux·运维·服务器·操作系统·select·poll·多路复用
没有bug.的程序员2 小时前
本地开发环境优化深度实战:Docker Compose 编排内核、依赖服务治理与极速环境搭建指南
运维·docker·容器·compose·本地开发·编排内核·依赖服务治理