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

相关推荐
JZC_xiaozhong2 小时前
BPM如何打通“请款→审批→付款”全链路?构建企业资金流转闭环
大数据·运维·数据库·数据分析·数据集成与应用集成·业务流程管理·流程监控
尘觉2 小时前
OpenClaw 入门:OpenClaw 环境搭建完整指南(Mac / Windows / Linux)(2026-3月最新版)
linux·windows·macos
yeflx2 小时前
Docker in Docker 实战
运维·docker·容器
xlp666hub2 小时前
进来看看你对进程虚拟内存的了解有多深?
linux·面试
yann_qu2 小时前
Mac通过ssh远程连接wsl
linux·windows·macos·ssh·wsl
默|笙2 小时前
【Linux】库制作与原理(3)_动静态库的链接过程
linux
一水鉴天2 小时前
整体设计的自动化部署完整方案 20260311 之3 加三个附件 readme/addon/plugin(豆包助手)
运维·自动化
悟空空心2 小时前
linux创建普通只读用户
linux·运维·chrome
曼岛_2 小时前
[AI实战]Ubuntu 下安装OpenClaw——从零搭建你的专属AI助理
linux·人工智能·ubuntu·openclaw·龙虾
试试勇气2 小时前
Linux学习笔记(十六)--进程信号
linux·笔记·学习