菜鸟科技网

Linux trace命令如何高效使用?

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

Linux trace命令如何高效使用?-图1
(图片来源网络,侵删)

当用户或开发者提到 "trace 命令" 时,他们通常指的是一系列用于追踪、分析和调试程序行为的工具,这些工具可以从不同层面(如系统调用、库函数、网络包、内核函数等)对程序进行“追踪”,并记录下其执行轨迹。

我会将最常用和最强大的几个 "trace" 工具进行分类和详细介绍,并说明它们各自的适用场景。


核心思想:追踪 vs. 剖析

在开始之前,理解两个概念的区别很重要:

  • 追踪:关注“发生了什么”,它按时间顺序记录下事件,比如某个函数在何时被调用、某个系统调用的参数和返回值是什么,它像是一个详细的日志。
  • 剖析:关注“在哪里花费了时间”,它统计程序在各个函数或代码块上花费的 CPU 时间,帮助开发者找到性能瓶颈,它像是一个开销报告。

下面介绍的工具有些偏向追踪,有些偏向剖析,有些两者兼备。

Linux trace命令如何高效使用?-图2
(图片来源网络,侵删)

系统调用追踪 (最接近 "trace" 概念的工具)

这类工具追踪程序与内核之间的交互,即系统调用。

strace - 系统调用追踪器

strace 是最著名、最常用的追踪工具之一,它打印出程序执行过程中的所有系统调用及其参数、返回值和执行时间。

如何使用:

基本用法非常简单,在 strace 后面加上你想要执行的命令即可。

Linux trace命令如何高效使用?-图3
(图片来源网络,侵删)
# 追踪 '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 - 库函数调用追踪器

ltracestrace 类似,但它追踪的是用户空间程序对共享库函数的调用,而不是内核系统调用。

如何使用:

用法与 strace 几乎完全相同。

# 追踪 'ls' 命令对 C 库函数的调用
ltrace ls -l

常用选项:

  • -f, -o, -p, -c, -S 等选项与 strace 类似。
  • -S: 同时显示系统调用(strace 的内容)。
  • -x: 打印字符串、指针等非整数参数的值。

适用场景:

  • 当问题出在用户空间的库函数中时,ltracestrace 更直接。
  • 分析程序如何使用标准 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-toolsbpfcc-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" 工具!

分享:
扫描分享到社交APP
上一篇
下一篇