SystemTap (简体中文)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
翻译状态:本文是 Systemtap翻译。上次翻译日期:2018-12-25。如果英文版本有所更改,则您可以帮助同步翻译。

Systemtap 是一种在运行时收集 Linux 系统信息的自由软件(GPL)框架。

SystemTap

安装 systemtapAURsystemtap-gitAUR。和上游版本的对比:[1].

要从源代码编译,请访问 这里。最新代码会包含新内核版本和发行版的支持。

标准内核

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

Arch 会从发布的二进制文件,包括内核中删除调试数据。很多 systmetap 功能就不能使用了。stapprobes 手册记录了 NON-DWARF 和 AUTO-DWARF 类型下什么功能可用:

  • kernel tracepoints: kernel.trace("*")
  • user-space probes: process("...").function("...") (for programs you build yourself with -g)
  • user-space markers: process("...").mark("...") (if they were configured with the <sys/sdt.h> markers)
  • perfctr-based probes: perf.*
  • non-dwarf kernel probes: kprobe.function("...") and nd_syscall.* tapset (if a /boot/System.map* file is available, see below).

内核重新编译

可用自定义 linux-custom 软件包之后再运行 SystemTap。重新编译 linux 软件包也非常方便。参考 Kernels/Traditional compilation

Prepare

First, run cd ~/ && mkdir build && cd build/ && asp checkout linux && cd linux/trunk to get the original kernel build files. Then use makepkg --verifysource to get the additional files. By performing the verification, you can safely skip the steps on "Update checksum".

修改config文件

编辑 config (32位内核) 或 config.x86_64 (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没被打开,修改这两个即可.

更新校验值

执行 md5sum config[.x86_64] 获得新的文件校验值.

编辑 PKGBUILD 文件, 这一部分 md5sums=('sum-of-first' ... 'sum-of-last') 和这一部分 source=('first-source' ... 'last-source') 是个数相同,顺序相同的, 把新获得的校验值在合适的位置替换.

makepkg --skipchecksums 使用命令可以跳过校验,但这样做对其它文件(比如下载的内核源码包)来说不安全,因此建议按这里给出的方法操作

编译并安装

可选步骤: 可以在 /etc/makepkg.conf 文件中设置 MAKEFLAGS="-j16" 加速编译.

执行 makepkg 开始编译, 然后 sudo pacman -U *.pkg.tar.gz 安装编译好的包. pacman 会提示你这是重新安装 (reinstall), 这就对了!

linuxlinux-headers 需要安, linux-docs 则随意.

通过这个方法, 外部内核模块 (例如 nvidiavirtualbox) 就不需要被重新编译了.

Systemtap

AUR 中安装systemtap即可: systemtapAUR, 完成.

编译自定义内核

参考这个 官方README

问题处理

版本匹配问题

如果出现如下错误:

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

请安装 systemtap-git。

System.map is missing

You can recover it where you build your linux kernel with DEBUG_INFO enabled

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

Alternately,

   sudo cp /proc/kallsyms /boot/System.map-`uname -r`

Process return probes not available

If you are sure that your kernel configuration is correct, but on launching stap you get both of the following messages:

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

then SystemTap may have failed to verify support for this feature. You can fix this by following the steps in System.map is missing.