Linux 系统中并没有一个名为 trace 的、像 ls 或 ps 那样通用的、内置的命令。

当用户或开发者提到 "trace 命令" 时,他们通常指的是一系列用于追踪、分析和调试程序行为的工具,这些工具可以从不同层面(如系统调用、库函数、网络包、内核函数等)对程序进行“追踪”,并记录下其执行轨迹。
我会将最常用和最强大的几个 "trace" 工具进行分类和详细介绍,并说明它们各自的适用场景。
核心思想:追踪 vs. 剖析
在开始之前,理解两个概念的区别很重要:
- 追踪:关注“发生了什么”,它按时间顺序记录下事件,比如某个函数在何时被调用、某个系统调用的参数和返回值是什么,它像是一个详细的日志。
- 剖析:关注“在哪里花费了时间”,它统计程序在各个函数或代码块上花费的 CPU 时间,帮助开发者找到性能瓶颈,它像是一个开销报告。
下面介绍的工具有些偏向追踪,有些偏向剖析,有些两者兼备。

系统调用追踪 (最接近 "trace" 概念的工具)
这类工具追踪程序与内核之间的交互,即系统调用。
strace - 系统调用追踪器
strace 是最著名、最常用的追踪工具之一,它打印出程序执行过程中的所有系统调用及其参数、返回值和执行时间。
如何使用:
基本用法非常简单,在 strace 后面加上你想要执行的命令即可。

# 追踪 'ls -l' 命令的所有系统调用 strace ls -l
常用选项:
-f: 追踪由fork()、vfork()、clone()创建的子进程。-F: (与-f类似) 追踪子进程。-o <file>: 将输出重定向到文件,而不是终端。strace -o ls_trace.txt ls -l
-p <pid>: 附接到一个正在运行的进程,而不是启动新进程。# 首先找到你的 shell 的 PID echo $$ # 假设 PID 是 12345,那么追踪它 strace -p 12345
-e trace=set: 只追踪指定的系统调用集合。# 只追踪文件相关的系统调用 (open, read, write, close...) strace -e trace=file ls -l
-c: 统计系统调用的次数、时间等,生成摘要报告(偏向剖析)。strace -c ls -l
-T: 显示每个系统调用的耗时(单位:秒)。strace -T ls -l
适用场景:
- 调试程序为什么启动缓慢、为什么会崩溃。
- 查看程序打开了哪些文件、读写哪些网络端口。
- 分析程序依赖的库和系统资源。
- 学习 Linux 系统调用。
ltrace - 库函数调用追踪器
ltrace 与 strace 类似,但它追踪的是用户空间程序对共享库函数的调用,而不是内核系统调用。
如何使用:
用法与 strace 几乎完全相同。
# 追踪 'ls' 命令对 C 库函数的调用 ltrace ls -l
常用选项:
-f,-o,-p,-c,-S等选项与strace类似。-S: 同时显示系统调用(strace的内容)。-x: 打印字符串、指针等非整数参数的值。
适用场景:
- 当问题出在用户空间的库函数中时,
ltrace比strace更直接。 - 分析程序如何使用标准 C 库(如
glibc)中的函数,如malloc,strcpy,printf等。 - 调试与第三方库相关的逻辑问题。
eBPF-based 高性能追踪 (现代 Linux 内核的利器)
eBPF (Extended Berkeley Packet Filter) 是 Linux 内核 4.0+ 引入的一项革命性技术,它允许在内核中安全、高效地运行沙箱程序,而无需修改内核代码或加载内核模块,这使得系统追踪的性能开销极低,功能极其强大。
bcc (BPF Compiler Collection) 是一套用于编写和运行 eBPF 程序的工具集,它提供了大量现成的、强大的追踪工具。
execsnoop - 追踪新执行的程序
# 追踪系统中所有新启动的进程 sudo execsnoop
输出会显示父进程 PID、子进程 PID、执行命令和参数。
opensnoop - 追踪文件打开操作
# 追踪系统中所有的 open, openat, creat 系统调用 sudo opensnoop
输出会显示进程 PID、用户、文件描述符和被打开的文件路径。
biolatency - 分析块设备 I/O 延迟
# 以直方图形式展示块设备 I/O 操作的延迟分布 sudo biolatency
这对于分析磁盘性能瓶颈非常有用。
tcpconnect - 追踪 TCP 连接
# 追踪所有发起的 TCP 连接 sudo tcpconnect
输出显示进程 PID、本地地址/端口、远程地址/端口和状态。
如何使用 eBPF 工具:
通常需要从 bcc-tools 或 bpfcc-tools 包中安装,并且必须使用 sudo 运行,因为它们需要将 eBPF 程序加载到内核中。
适用场景:
- 生产环境性能分析:由于其极低的开销,eBPF 工具非常适合在繁忙的服务器上使用。
- 实时网络流量分析:
tcplife,tcpconnect等工具可以无侵入地监控网络活动。 - 内核和驱动程序调试:可以追踪内核函数的调用。
- 安全审计:监控敏感的系统调用或文件访问。
通用剖析和追踪工具
这类工具功能更全面,不仅能追踪,还能进行深度剖析。
perf - Linux 性能剖析工具
perf 是 Linux 官方提供的、功能极其强大的性能分析工具,它可以用来追踪硬件事件(如 CPU 缓存未命中)、软件事件(如上下文切换)和内核/用户函数。
如何使用:
perf 的功能非常丰富,这里介绍几个最常用的追踪模式。
a) 追踪系统调用和内核函数:
# 追踪 'ls -l' 命令期间的所有内核函数和系统调用 sudo perf record -g ls -l # 记录完成后,用 perf report 查看报告 sudo perf report
b) 追踪用户空间函数:
# 首先需要为你的程序编译时加入调试信息 (-g) gcc -g my_program.c -o my_program # 追踪 my_program 的所有用户空间函数调用 sudo perf record -g ./my_program sudo perf report
c) perf top - 实时性能分析器:
# 实时显示占用 CPU 最多的内核或用户空间函数 sudo perf top
适用场景:
- CPU 性能瓶颈分析:找到程序中最耗时的函数。
- 上下文切换过多问题:分析为什么进程会频繁地在 CPU 之间切换。
- 内存访问模式分析:分析 CPU 缓存命中率。
- 硬件性能计数器分析:深入了解 CPU 的行为。
总结与对比
| 工具 | 追踪对象 | 开销 | 主要用途 | 是否需要 root |
|---|---|---|---|---|
strace |
系统调用 | 低 | 调试与内核的交互、文件/网络访问 | 是(部分功能) |
ltrace |
库函数调用 | 低 | 调试用户空间库函数逻辑 | 否 |
execsnoop |
新进程创建 | 极低 | 实时监控进程启动 | 是 |
opensnoop |
文件打开 | 极低 | 实时监控文件访问 | 是 |
perf |
硬件/软件事件、函数 | 中等 | CPU 性能剖析、函数追踪 | 是(部分功能) |
ftrace |
内核函数 | 极低 | 内核开发者调试、内核剖析 | 是 |
如何选择?
-
如果你想知道程序为什么崩溃或无法访问某个文件?
- 首选
strace,它能清晰地展示程序在死掉前做了什么系统调用。
- 首选
-
如果你想知道程序是如何使用某个库函数的?
- 使用
ltrace。
- 使用
-
如果你想在生产环境中实时监控系统发生了什么(如谁在创建新进程、谁在读写文件)?
- 使用
bcc工具集(如execsnoop,opensnoop),它们性能开销极小,对系统影响最小。
- 使用
-
如果你的程序运行缓慢,想找到是哪个函数拖慢了速度?
- 使用
perf record进行采样,然后用perf report生成报告,这是 CPU 性能分析的金标准。
- 使用
-
如果你是内核开发者,需要追踪内核函数?
- 使用
ftrace,它是内核内置的、功能强大的追踪框架。
- 使用
希望这份详细的指南能帮助你理解和使用 Linux 中的各种 "trace" 工具!
