systemtap工具

2020-11-12  本文已影响0人  小小怪吃吃吃

一、简介

    systemtap是Linux下一个非常有用的调试(跟踪/探测)工具,常用于Linux内核或者应用程序的信息采集,比如:获取一个函数里面运行时的变量、调用堆栈,甚至可以直接修改变量的值,对诊断性能或功能问题非常有帮助。

二、适用情景解决的问题

1 解决的问题

需要获取正在运行的Linux系统的信息,如系统调用等。

2 适用情景

三、安装与运行

    systemtap运行需要内核的调试信息支撑,默认发行版的内核在配置时这些调试开关没有打开。systemtap依赖的package:elfutils(提供分析调试信息的库函数)、gcc(C语言编译器)、linux-headers-generic(编译内核模块所需的内核头文件以及模块配置信息)、kernel-devel、kernel-debuginfo(内核调试信息)。如果调用用户态进程,还需要该程序有调试符号,否则无法调试。以下是ubuntu16.04 TLS的安装过程。

0 判断内核是否支持systemtap

在 /boot 目录下查看当前版本的配置信息,是否包含如下的编译选项:

cat /boot/config-`uname -r` | egrep 'CONFIG_(DEBUG_INFO|KPROBES|DEBUG_FS|RELAY)='

如果没有上述的配置项,则需要重新编译,需要打开调试信息、Kprobe 和 debugfs ,确保 .config 文件中看到上面的四个选项。

1 源码安装systemtap

wget ftp://sources.redhat.com/pub/systemtap/releases/systemtap-4.1.tar.gz
tar -zxvf systemtap-4.1.tar.gz
wget https://sourceware.org/elfutils/ftp/0.176/elfutils-0.176.tar.bz2
tar -jxvf elfutils-0.176.tar.bz2
cd systemtap-4.1
./configure --with-elfutils=/home/ubuntu16/elfutils-0.176 --with-prefix=/usr

在编译过程中会出现一些error,要求各种依赖库,安装即可:

sudo apt-get install zlib1g-dev
sudo apt-get install libcurl4-openssl-dev -y
sudo apt-get install -y libmicrohttpd-dev -y
sudo apt-get install libsqlite3-dev -y
sudo apt-get install -y libarchive-dev -y
sudo apt-get install m4 -y
sudo apt-get install -y gawk

报错提示,跟着提示安装即可:

./configure  '--with-elfutils=/home/ubuntu16/elfutils-0.176' '--with-prefix=/usr' python='/usr/bin/python2' pyexecdir='${exec_prefix}/lib/python2.7/dist-packages' python3='/usr/bin/python3' py3execdir='${exec_prefix}/lib/python3.5/site-packages' --prefix=/home/ubuntu16/systemtap-4.1-17624

将systemtap加入/usr/lib

ln -s systemtap /usr/local/bin

2 安装内核调试包

# 查看需要的包
stap-prep
# 查看内核版本
uname -r

参考:https://blog.csdn.net/u011944141/article/details/89512116

# 创建 /etc/apt/sources.list.d/ddebs.list
echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse" | sudo tee -a /etc/apt/sources.list.d/ddebs.list
echo -e "deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse\ndeb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse" | sudo tee -a /etc/apt/sources.list.d/ddebs.list
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F2EDC64DC5AEE1F6B9C621F0C8CAB6595FDFF622
sudo apt-get update
# 继续检测
stap-prep
# Please install linux-image-4.15.0-112-generic-dbgsym
sudo apt-get install linux-image-4.15.0-112-generic-dbgsym
# 再次检测安装环境
stap-prep
# 运行测试执行脚本
sudo ./stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}'

3 测试示例

sudo stap -v -e 'probe begin { printf("Hello, World!\n"); exit() }'
sudo stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}'

四、工作原理

    systemtap的核心思想是定义一个事件(event),以及给出处理该事件的句柄(Handler)。当一个特定的事件发生时,内核运行该处理句柄,就像快速调用一个子函数一样,处理完之后恢复到内核原始状态。这里有两个概念:

参考

1、https://www.cnblogs.com/hazir/p/systemtap_introduction.html

上一篇 下一篇

猜你喜欢

热点阅读