博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用systemtap调试linux内核
阅读量:4030 次
发布时间:2019-05-24

本文共 2138 字,大约阅读时间需要 7 分钟。

http://blog.csdn.net/heli007/article/details/7187748 

安装SystemTap(ubuntu10.10)

简便的安装方式通过下面命令直接下载并安装在系统里:

# sudo apt-get install systemtap

也可以去

下载各种版本的systemtap。

具体的安装说明可以参考官网上的指导:

我参考的是一篇技术博客:

 

Ubuntu Desktop默认没有安装kernel debug info的包,systemtap无法追踪内核信息。查看内核版本:

# uname –r

在下载对应的kernel debug info包

在网上下载不到linux-image-2.6.35-22-generic-dbgsym_2.6.35-22.35_i386.ddeb这个调试包,只用2.6.32和2.6.38版本的,所以我在vbox虚拟机上安装了ubuntu10.04(下载地址:),其内核版本是:2.6.32-33-generic

在地址可以下载到对应的kernel debug info

注意下载调试包的时候注意后面的小号也要一致!用# uname –a来查看小号!

根据systemtap的语法规则,我尝试了一些命令的编写,可以编写个脚本对文件进行监测:

# sudo stap ‘probegeneric.fop.open { if(filename == "secrets") printf("%s isopening my file: %s\n", execname(), filename) }’

先运行上面监测命令,当打开secrets文件时,终端上将显示对文件的操作!


# sudo stap –ve ‘probebegin { printf("a \\ b "); for (c = 40; c < 48; c++) printf("%d ", c); printf("\12"); for (l = 0; l < 71; l++)printf("-"); printf("\12"); for (r = 30; r < 38; r++)for (t = 0; t < 2; t++) { printf("%d ", r); for (c = 40; c <48; c++) printf("\033[%d;%d%s %s \033[0;0m", r, c, !t ? "m": ";1m", !t ? "Normal" : "Bold ");printf("\12"); } exit(); }’

SystemTap不仅仅是一个简单的调试工具,强大的脚本语言能力让它同样能做一些有趣的事情,下面这个例子就可以对输出的字符进行美化:

在进行性能分析的时候,我们常常需要知道那些函数调用次数最多,才能有的放矢地展开分析。下面这个简单的例子可以打印出在过去的5秒钟里调用次数最多的那些系统调用。

# sudo stap -ve'global syscalls function print_top () { cnt=0 log("SYSCALL\t\t\t\tCOUNT") foreach ([name] in syscalls-) {printf("%-20s\t\t%5d\n",name, syscalls[name]) if (cnt++ == 10) break} printf("--------------------------------------\n") delete syscalls} probe syscall.* { syscalls[probefunc()]++ } probe timer.ms(5000) { print_top() }'

小结:

    在运行几个脚本后,我逐渐发现systemtap之所以受linux程序员的欢迎,是因为当你需要打印出某个函数的参数时,不再需要在内核源码中重新插入一行输出代码,然后重新编译内核才能看到想要输出的结果。有了systemtap可以通过编写一些脚本文件(.stp)自由的收集调试信息和性能数据,无需修改内核代码和漫长的内核代码编译了。

经过几个测试,开始了解了systemtap的基本工作原理,下面简单说下5个pass的作用:

Pass 1 - parse:这个阶段主要是检查输入脚本是否存在语法错误,例如大括号是否匹配,变量定义是否规范等

Pass 2 - elaborate:这个阶段主要是对输入脚本中定义的探测点或者用到的函数展开,不但需要综合SystemTap的预定义脚本库,还需要分析内核或者内核模块的调试信息

Pass 3 -translate: 在这个阶段,将展开后的脚本转换成C文件。前三个阶段的功能类似于编译器,将.stp文件编译成为完整的.c文件,因此又被合起来称为转换器(translator)

Pass 4 - build:在这个阶段,将C源文件编译成内核模块,在这过程中还会用到SystemTap的运行时库函数。

Pass 5 - run:这个阶段,将编译好的内核模块插入内核,开始进行数据收集和传输。

你可能感兴趣的文章
贝叶斯
查看>>
推荐系统总结
查看>>
relu与sigmod的比较
查看>>
交叉熵和均方差损失函数的比较(Cross-Entropy vs. Squared Error)
查看>>
九大排序算法总结
查看>>
Spannable 和 Editable、SpannableString 和 SpannableString
查看>>
Java注解Annotation使用
查看>>
Handler、Message、Looper、MessageQueue
查看>>
java多线程之六种状态
查看>>
go指针
查看>>
设计模式之工厂模式---对象的实例化部分提取出来---三种不同的提取方法
查看>>
设计模式之策略模式
查看>>
设计模式之观察者模式
查看>>
设计模式之装饰者模式
查看>>
设计模式之代理模式
查看>>
设计模式之组合模式
查看>>
javaIO
查看>>
activity
查看>>
Fragment
查看>>
Service
查看>>