[转帖]Systemtap的另类用法

systemtap,另类,用法 · 浏览次数 : 0

小编点评

## Summary of the content This document explains how to use the systemtap tool for kernel programming. It introduces the tool and its capabilities, then demonstrates how to use it to achieve basic kernel tasks. **Key points:** * systemtap is a script that translates to c kernel modules and integrates with the kernel for communication. * It supports both normal and guru modes for different development environments. * It allows users to write experiments directly in c. * It has a downside: header files must be located within the kernel include path. * It provides a way to overcome this limitation by setting `STAP_CFLAGS` environment variable. * It demonstrates how to use systemtap to achieve basic kernel tasks with simple examples. **Overall, this document provides a comprehensive introduction to systemtap and its capabilities for kernel programming.**

正文

 

November 10th, 2010Yu Feng
 

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: Systemtap的另类用法

通常我们在做内核编程的时候,会用到内核的数据结构,比如说textsearch提供了几种算法用于支付串查找。在用于正式的项目前,我们会希望考察下他的用法以及想体验下。最通常的做法是自己写个module,写个makefile,编译,运行,然后去dmesg里面看printk的结果。这个过程没啥问题,就是太罗嗦。好了,现在我们有更方便的方法了:systemtap.

Systemtap是个脚本,先翻译成c kernel模块代码,然后编译,插入到内核运行,同时提供最基本的内核和应用模块的通讯管道,在应用模块这里收集信息。 它还支持guru模式,让用户直接插入c代码。 这样我们就可以利用stap的这一特性来做我们的实验。

底下我们来演示下:

# cat ts.stp
%{
#include <linux/textsearch.h>
%}
function test_textsearch:long (algo:string) %{ /* pure */ /* unprivileged */
struct ts_config* ts;
struct ts_state state;
 
ts = textsearch_prepare(THIS->algo, "world", 5, GFP_KERNEL, TS_AUTOLOAD);
if(IS_ERR(ts)) goto err;
_stp_printf("%s\n""prepare ok!");
if(UINT_MAX==textsearch_find_continuous(ts, &state, "hello world", 11)) goto err;
_stp_printf("%s\n""find ok!");
textsearch_destroy(ts);
THIS->__retvalue = 0;
return;
err:
_stp_printf("%s\n""init error!");
THIS->__retvalue = -1;
return;
%}
 
probe begin
{
printf("result:%d\n", test_textsearch(@1));
exit();
}
 
%%请注意我们上面用到了 _stp_printf,代替printk, 这个是stap的runtime的基础服务。
 
# stap -gu ts.stp bm %%我们用的是BM算法
prepare ok!
find ok!
result:0

cool吧! 把c语言当脚本编写啦。

但是这个stap有个缺点,就是头文件必须是内核include路径里面的,如果我们用到了其他头文件,编译的时候就出错。

# touch xyz.h #建个空的头文件
# diff -u ts.stp ts1.stp
--- ts.stp      2010-11-08 12:04:54.000000000 +0800
+++ ts1.stp     2010-11-10 14:19:47.000000000 +0800
@@ -1,5 +1,6 @@
 %{
 #include <linux/textsearch.h>
+#include "xyz.h"
 %}
  
# stap -gu ts1.stp bm
/tmp/stapKuLo9R/stap_90d03f83d4d4a8efa7b721a6ff0093fe_2503.c:169:17: error: xyz.h: No such file or directory
make[1]: *** [/tmp/stapKuLo9R/stap_90d03f83d4d4a8efa7b721a6ff0093fe_2503.o] Error 1
make: *** [_module_/tmp/stapKuLo9R] Error 2
Pass 4: compilation failed.  Try again with another '--vp 0001' option.

这个问题挺烦人的,但是我们有探索精神,不怕的,我们来crack下吧

# diff systemtap-1.3/buildrun.cxx systemtap-1.3.patched/buildrun.cxx
235a236,238
>
>   o << "EXTRA_CFLAGS += $(STAP_CFLAGS)" << endl;
>
237a241
>
# ./configure --prefix=/usr && make && make install

到现在为止 stap是crack过的. 我们再来实验下吧!首先把我们的头文件所在的路径通知到systemtap,它会在让编译模块的时候加上我们的头文件路径。

# export STAP_CFLAGS="-I`pwd`"
# printenv STAP_CFLAGS
-I/home/wentong
 
# stap -gu ts1.stp bm
prepare ok!
find ok!
result:0

哈哈,成功了。

大家可以这样的方式用stap写很多好玩的东西,祝玩的开心。

与[转帖]Systemtap的另类用法相似的内容:

[转帖]Systemtap的另类用法

November 10th, 2010Yu Feng 原创文章,转载请注明: 转载自系统技术非业余研究 本文链接地址: Systemtap的另类用法 通常我们在做内核编程的时候,会用到内核的数据结构,比如说textsearch提供了几种算法用于支付串查找。在用于正式的项目前,我们会希望考察下他的用法

[转帖]TCP的blacklog之全连接队列与半连接队列的深入研究

文章目录 Linux内核探测工具systemtap的安装与使用backlog、半连接队列、全连接队列是什么半连接队列、全连接队列基本概念 linux 内核是如何计算半连接队列、全连接队列的半连接队列的大小的计算模拟半连接队列占满全连接队列(Accept Queue) SYN+ACK重传次数全连接队列

[转帖]内核探测工具systemtap简介

https://www.bilibili.com/read/cv16655736/ systemtap是内核开发者必须要掌握的一个工具,本文我将简单介绍一下此工具,后续将会有系列文章介绍systemtap的用法。 什么是systemtap 假如现在有这么一个需求:需要获取正在运行的 Linux 系统

【转帖】linux 内核分析工具 Dtrace、SystemTap、火焰图、crash等

<< System语言详解 >> 关于 SystemTap 的书。 我们在分析各种系统异常和故障的时候,通常会用到 pstack(jstack) /pldd/ lsof/ tcpdump/ gdb(jdb)/ netstat/vmstat/ mpstat/truss(strace)/iostat/s

[转帖]Systemtap系列之语法专辑

1. 常用技巧 systemtap可以实现交叉编译: 编译可执行模块如下: stap -r kernel_version script -m module_name 运行命令如下: staprun module_name.ko stap命令会读取脚本的指令,并翻译成C代码,编译成内核模块加载到内核。

[转帖]systemtap - perf - 火焰图

https://www.cnblogs.com/hixiaowei/p/15580662.html 0. 火焰图生成框架 1. Capture stacks 2. Fold stacks 3. flamegraph.pl 1. perf (13条消息) 性能分析之profiling及火焰图_巷中人的

[转帖]s-systemtap工具使用图谱(持续更新)

整体的学习思维导图如下,后续持续更新完善文章目录​​安装​​​​简介​​​​执行流程​​​​执行方式​​​​stap脚本语法​​​​探针语法​​​​API函数​​​​探针举例​​​​变量使用​​​​基本应用​​​​1. 定位函数位置​​​​2. 查看文件能够添加探针的位置​​​​3. 打印函数参数(

[转帖]s-systemtap工具使用图谱(持续更新)

整体的学习思维导图如下,后续持续更新完善文章目录​​安装​​​​简介​​​​执行流程​​​​执行方式​​​​stap脚本语法​​​​探针语法​​​​API函数​​​​探针举例​​​​变量使用​​​​基本应用​​​​1. 定位函数位置​​​​2. 查看文件能够添加探针的位置​​​​3. 打印函数参数(

[转帖]巧用Systemtap注入延迟模拟IO设备抖动

http://blog.yufeng.info/archives/2935 原创文章,转载请注明: 转载自系统技术非业余研究 本文链接地址: 巧用Systemtap注入延迟模拟IO设备抖动 当我们的IO密集型的应用怀疑设备的IO抖动,比如说一段时间的wait时间过长导致性能或其他疑难问题的时候,这个

[转帖]使用perf生成Flame Graph(火焰图)

https://www.cnblogs.com/keanuyaoo/p/3313378.html 具体的步骤参见这里: 《flame graph:图形化perf call stack数据的小工具》 使用SystemTap脚本制作火焰图,内存较少时,分配存储采样的数组可能失败,需要编写脚本,还要安装k