SystemTap
SystemTap 提供了自由软件 (GPL) 基础设施,以简化收集有关正在运行的 Linux 系统的信息。
安装
只需安装 systemtap 或 systemtap-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_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"
以加快编译速度。
此构建将需要大约 12 GB 的磁盘空间。如果您有大容量 DRAM,请考虑使用内存中的 tmpfs。运行 makepkg
或 makepkg --skipchecksums
进行编译,然后只需 sudo pacman -U *.pkg.tar.gz
安装软件包。pacman 会提示您重新安装,您应该回答 y。
linux 和 linux-headers 应该重新安装,linux-docs 无关紧要。
通过这种方法,外部模块(例如 nvidia 和 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 丢失 中的步骤来解决此问题。