Linux安装SystemTap工具观测Linux行为

441 阅读2分钟

SystemTap是一种可以探测内核行为的探针工具,在张师傅的博客里就多次用到这个工具。本文主要记录如何在Linux中安装SystemTap工具来观测内核的行为。

环境准备:一个Linux系统,可以用虚拟机安装Ubuntu发行版或者CentOS发行版。本文使用的内核版本信息为 5.15.0-47-generic #51-Ubuntu SMP Thu Aug 11 07:51:15 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

安装stap命令

// 安装stap
sudo apt install stap

// 检查stap是否安装成功,如果以下命令没有报错的话,即说明安装成功
sudo stap -ve 'probe begin {log("hello!") exit()}'

Pasted image 20221215160450.png

但是当要探测Linux内核函数时,就会发现报错

sudo stap -ve 'probe kernel.function("tcp_v4_conn_request") {printf("hello world");}'

Pasted image 20221215160520.png

因为没有安装Linux系统对应的符号表,所以当我们指定内核函数tcp_v4_conn_request的时候,就无法识别到内核函数。

安装符号表

// 找到linux当前的版本
uname -a

// 显示如下,x86_64表示amd64,版本号为5.15.0-47-generic
// Linux peng 5.15.0-47-generic #51-Ubuntu SMP Thu Aug 11 07:51:15 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

// 下载对应版本的符号表。如果发现找不到对应的符号表,那么说明现在安装的Linux系统没有对应的符号表,这样就不能探测到内核函数。
// 可以到 http://ddebs.ubuntu.com/pool/main/l/linux 下查看linux支持什么版本的符号表
// https://launchpad.net/~canonical-kernel-team/+archive/ubuntu/ppa2/+build/24861195/+files/linux-image-unsigned-5.15.0-56-generic-dbgsym_5.15.0-56.62_amd64.ddeb
wget http://ddebs.ubuntu.com/pool/main/l/linux/linux-image-unsigned-5.15.0-47-generic-dbgsym_5.15.0-47.51_amd64.ddeb

// 导入linux 符号表
sudo dpkg -i linux-image-unsigned-5.15.0-47-generic-dbgsym_5.15.0-47.51_amd64.ddeb

// 检查符号表是否导入成功
sudo stap -ve 'probe kernel.function("tcp_v4_conn_request") {printf("hello world");}'

此时再次用stap工具对内核函数做探针,发现已经没有报错,并且已经能够正常运行了

Pasted image 20221215162032.png

此时用nc命令测试一下探针是否真的生效。在虚拟机上用 nc -l 8090启动一个tcp服务,然后在宿主机用 nc 10.211.55.6 8090 连接虚拟机,此时会发现在stap的执行终端里出现了 hello world。说明此时探针已经生效。

Pasted image 20221215163032.png

此时,stap命令安装已经安装完成。更多用法可以参照: sourceware.org/systemtap/t…

此外,需要注意的是,systemtap既支持stp后缀的脚本,也支持嵌入C代码,这两个在命令执行上有点区别。

// 执行stap脚本,-v 表示执行时展示详细信息,stap命令后可以直接对接 .stp 后缀的脚本
sudo stap -v tcp_backlog.stp

// 执行嵌入C代码时,需要加上 -g 选项。注意不能用 -g 选项对接 .stp 后缀的脚本,不然会出现 "Invalid Module format" 的报错
sudo stap -g tcp_backlog.c