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

相关推荐
A小辣椒1 天前
TShark:Wireshark CLI 功能
linux
A小辣椒2 天前
TShark:基础知识
linux
AlfredZhao2 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334663 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪3 天前
linux 拷贝文件或目录到指定的位置
linux
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式