使用systemtap分析ceph源码流程

来源:互联网 发布:unity3d spine 编辑:程序博客网 时间:2024/05/16 07:25

                     说明:之前一直用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

                      [root@ceph1 ~]# 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是个非常神奇的工具。不需要编译源码,下断点。只要写好脚本,分析源码流程简单方便。内容打印详细。还可以用来分析内核哦。

原创粉丝点击