跳转至内容

SystemTap

来自 ArchWiki

SystemTap 提供免费软件 (GPL) 基础设施,以简化对运行中 Linux 系统信息的收集。

安装

只需 安装 systemtap 包即可。

标准内核

您至少需要安装 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" 以加快编译速度。

重构的 linuxlinux-headers 包应该被重新安装,linux-docs 则无关紧要。

通过这种方法,外部模块(例如 nvidia-openvirtualbox)无需重新构建。

构建自定义内核

请参考此 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 is missing 中的步骤来解决此问题。