SystemTap

来自 ArchWiki

SystemTap 提供了自由软件 (GPL) 基础设施,以简化收集有关正在运行的 Linux 系统的信息。

安装

只需安装 systemtapsystemtap-gitAUR,就完成了。将其与 [1] 上的最新上游版本进行比较。

也考虑从 [2] 的源代码构建它,在这里,对较新内核或发行版的支持首次出现。

标准内核

你至少需要安装 linux-headers 软件包。

由于 Arch 永久性地从其发行的二进制文件(包括内核)中剥离了调试数据,因此许多常见/更高级的 systemtap 功能将不可用,因此 /usr/share/doc/systemtap/examples 中的许多示例将无法工作。但是,请参阅 stapprobes(3) 以了解 NON-DWARF 和 AUTO-DWARF 探针类型仍然可以工作的功能,例如

  • 内核跟踪点:kernel.trace("*")
  • 用户空间探针:process("...").function("...") (对于您自己使用 -g 构建的程序)
  • 用户空间标记:process("...").mark("...") (如果它们配置了 <sys/sdt.h> 标记)
  • 基于 perfctr 的探针:perf.*
  • 非 dwarf 内核探针:kprobe.function("...") 和 nd_syscall.* tapset(如果 /boot/System.map* 文件可用,请参见下文)。

内核重建

您可以考虑构建 linux-custom 软件包来运行 SystemTap,但是重建 linux 软件包很容易且高效。

准备

首先,按照 Kernel/Arch build system#Getting_the_ingredients 中的步骤获取原始内核构建文件。然后使用 makepkg --verifysource 获取其他文件。通过执行验证,您可以安全地跳过“更新校验和”的步骤。

修改配置

编辑 config.x86_64,启用这些选项

  • CONFIG_KPROBES=y
  • CONFIG_KPROBES_SANITY_TEST=n
  • CONFIG_KPROBE_EVENT=y
  • CONFIG_NET_DCCPPROBE=m
  • CONFIG_NET_SCTPPROBE=m
  • CONFIG_NET_TCPPROBE=y
  • CONFIG_DEBUG_INFO=y
  • CONFIG_DEBUG_INFO_REDUCED=n
  • CONFIG_X86_DECODER_SELFTEST=n
  • CONFIG_DEBUG_INFO_VTA=y

默认情况下,仅未设置 CONFIG_DEBUG_INFOCONFIG_DEBUG_INFO_REDUCED

使用当前的 linux 内核(已使用 3.15.2 测试),您可以简单地将这些行附加到 config.x86_64

x86_64
echo '
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_INFO_REDUCED=n
' >> config.x86_64
注意: 如果您想将这些行放入自行维护的脚本中,请不要在 CONFIG_* 行之前插入任何空格。

更新校验和

提示: 如果您之前验证了源文件,则可以安全地跳过此步骤。

运行 sha256sum config.x86_64 以获取新的 sha256sum。

PKGBUILD 文件中,sha256sum=('sum-of-first' ... 'sum-of-last')source=('first-source' ... 'last-source') 的顺序相同,将您的新 sha256sum 放在正确的位置。

构建和安装

可选:建议在 /etc/makepkg.conf 中设置 MAKEFLAGS="-j16" 以加快编译速度。

此构建将需要大约 12 GB 的磁盘空间。如果您有大容量 DRAM,请考虑使用内存中的 tmpfs。运行 makepkgmakepkg --skipchecksums 进行编译,然后只需 sudo pacman -U *.pkg.tar.gz 安装软件包。pacman 会提示您重新安装,您应该回答 y。

linuxlinux-headers 应该重新安装,linux-docs 无关紧要。

通过这种方法,外部模块(例如 nvidiavirtualbox)不需要重建。

构建自定义内核

请参考此 README

故障排除

启动时 Pass 4 失败

如果您收到以下错误消息,请尝试安装 systemtap-gitAUR

/usr/share/systemtap/runtime/stat.c:214:2: error: 'cpu_possible_map' undeclared (first use in this function)

System.map 丢失

您可以在启用 DEBUG_INFO 的 linux 内核构建位置恢复它

# cp src/linux-3.6/System.map /boot/System.map-3.6.7-1-ARCH

或者,

# cp /proc/kallsyms /boot/System.map-$(uname -r)

进程返回探针不可用

如果您确定您的内核配置正确,但在启动 stap 时收到以下两条消息

WARNING: Kernel function symbol table missing [man warning::symbols]
semantic error: process return probes not available [man error::inode-uprobes]

那么 SystemTap 可能未能验证对此功能的支持。您可以通过按照 #System.map 丢失 中的步骤来解决此问题。