说明:之前一直用gdb和lttng 调试ceph源码,后来又发现了systemtap,下面对比下这三种工具。
一,3种源码分析工具的比较
1,gdb
优点:擅长做精细化的调试。比如查看变量内容,查看内存内容,下条件断点等。
缺点:不适合跟很长的流程,频繁打断点,回溯函数堆栈很累。
2,lttng
优点:ceph自带,兼容性好。适当的时候可以打印关键变量内容。
缺点:需要修改源码,写入tracepoint,然后重新编译源码。过程比较繁琐。
3,systemtap
优点:擅长分析代码流程,打印函数调用关系,不需要修改源码,据说还能分析性能瓶颈。
缺点:需要写点调试脚本。
1,2 两种工具已经介绍过,安装编译过程,在ceph源码群里有。下面重点介绍systemtap
二, 安装systemtap环境
1,部署ceph环境
这个就不多说了。
2,安装systemtap工具
安装下面2个包
systemtap
systemtap-runtime
#yum install systemtap systemtap-runtime
3, 安装内核调试信息
连上外网,使用stap-prep 命令安装
# stap-prep
如果不能连上外网,或者没有yum源,需要手动下载内核调试信息安装
首先查看内核版本号uname -r
[[email protected] ~]#
uname -r
3.10.0-123.el7.x86_64
那么需要安装的内核包如下:
kernel-debuginfo-3.10.0-123.el7.x86_64
kernel-debuginfo-common-x86_64-3.10.0-123.el7.x86_64
kernel-devel.x86_64-3.10.0-123.el7.x86_64
4, 安装ceph调试信息包
去官网下载ceph调试包
ceph-debuginfo.x86_64
并安装,ceph调试包的版本号,必须和所部署的ceph的版本号一致。
三,编辑systemtap调试脚本
1,加入我们要调试osd
#ps -ef | grep osd
查看osd的进程号
2,编辑systemtap脚本
#vi osd.stp
3,编辑我们想要分析的内容
比如我们想打印出当前正在运行的osd的OSD类的所有函数
probe process("ceph-osd").function("OSD::*").call
, process("ceph-osd").function("OSDService::*").call
{
printf("%s -> %s\n", thread_indent(4), ppfunc());
}
写入osd.stp文件。
process表示程序的名称,function表示函数的名字,如果OSD::*,表示输出所有OSD类的相关函数。
printf表示打印出,用法类似c语言的printf,thread_indent表示打印线程号,ppfunc()表示打印出函数名
4,运行我们编辑的脚本
#stap -x {osdpid} osd.stp
-x后面跟osd进程id, osd.stp就是我们刚才编辑的脚本
5,查看osd打印的日志结果。
所有osd进程里,与OSD类和OSDService相关的类的函数,和调用关系,都被打印出来啦!
四,总结
systemtap是个非常神奇的工具。不需要编译源码,下断点。只要写好脚本,分析源码流程简单方便。内容打印详细。还可以用来分析内核哦。