SystemTap
SystemTap 提供免费软件 (GPL) 基础设施,以简化对运行中 Linux 系统信息的收集。
安装
标准内核
您至少需要安装 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=yCONFIG_KPROBES_SANITY_TEST=nCONFIG_KPROBE_EVENT=yCONFIG_NET_DCCPPROBE=mCONFIG_NET_SCTPPROBE=mCONFIG_NET_TCPPROBE=yCONFIG_DEBUG_INFO=yCONFIG_DEBUG_INFO_REDUCED=nCONFIG_X86_DECODER_SELFTEST=nCONFIG_DEBUG_INFO_VTA=y
默认情况下,只有 CONFIG_DEBUG_INFO 和 CONFIG_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
更新校验和
运行 sha256sum config.x86_64 以获取新的 sha256sum。
在 PKGBUILD 文件中,sha256sum=('sum-of-first' ... 'sum-of-last') 与 source=('first-source' ... 'last-source') 的顺序相同,将您的新 sha256sum 放在正确的位置。
构建和安装
可选:建议在 /etc/makepkg.conf 中设置 MAKEFLAGS="-j16" 以加快编译速度。
重构的 linux 和 linux-headers 包应该被重新安装,linux-docs 则无关紧要。
通过这种方法,外部模块(例如 nvidia-open 和 virtualbox)无需重新构建。
构建自定义内核
请参考此 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 中的步骤来解决此问题。