zoukankan      html  css  js  c++  java
  • kgtp

    kgtp使用总结
    1,介绍:
    Kgtp项目主页是:http://code.google.com/p/kgtp/
    如其项目主页所描述,Kgtp是一个实时且轻量级的Linux跟踪内核调试工具。也许说是一个内核跟踪调试接口更合适,通过它来连通内核和GDB,使得GDB可以对内核进行跟踪调试。GDB既可以是在本机,也可以在另外一台机器上,甚至还可以进行离线调试,而这些感觉应该都是GDB本身提供的Targets、Trace Files等功能,而Kgtp主要还是进行内核调试信息的收集与交互、导出等,当然,Kgtp可能也会提供一些其它辅助GDB的功能。
    Kgtp目前支持X86-32,X86-64,MIPS和ARM平台。

    2,编译:
    2.1,内核
    既然是跟踪调试内核,选定并编译我们自己的内核是必须的,内核的编译安装等步骤无需多说,但为了达到本文的既定目的,选上如下几个编译选项是必不可少的:

    1
    2
    3
    4
    5
    6
    General setup  --->
         [ * ] Prompt for development and/or incomplete code/drivers
         [ * ] Kprobe
    Kernel hacking  --->
         [ * ] Compile the kernel with debug info
         [ * ] Compile the kernel with frame pointers

    2.2,Kgtp
    从Kgtp主页下载到最新的项目源码,我这里是kgtp_20111111.tar.bz2,解压、make即可:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [root@localhost ~]# tar xjf kgtp_20111111.tar.bz2
    [root@localhost ~]# cd kgtp
    [root@localhost kgtp]# make
    gcc -O2 -o getmod getmod.c
    gcc -O2 -o getframe getframe.c
    /tmp/cca2MJof.o: In function `main':
    getframe.c:(.text+0x308): warning: the use of `mktemp' is dangerous, better use `mkstemp'
    make CROSS_COMPILE= -C /lib/modules/2.6.36/build/ M=/root/kgtp modules
    make[1]: Entering directory `/usr/src/linux-2.6.36'
      CC [M]  /root/kgtp/gtp.o
      Building modules, stage 2.
      MODPOST 1 modules
      CC      /root/kgtp/gtp.mod.o
      LD [M]  /root/kgtp/gtp.ko
    make[1]: Leaving directory `/usr/src/linux-2.6.36'
    [root@localhost kgtp]#

    如果是ARM等需要交叉编译环境,那就修改一下目录里的Makefile文件,不表。

    3,安装使用:
    3.1,安装
    编译之后的Kgtp就是一个内核模块,insmod即可,不过在insmod之前需先查看mount是否包含有如下两行:

    1
    2
    3
    4
    [root@localhost ~]# mount
    sysfs on /sys type sysfs (rw)
    none on /sys/kernel/debug type debugfs (rw)

    如果没有则需执行如下对应的命令进行挂载:

    1
    2
    [root@localhost ~]# mount -t sysfs none /sys/
    [root@localhost ~]# mount -t debugfs none /sys/kernel/debug/

    如果不这样做,会导致Kgtp模块安插完之后,/sys/kernel/debug/下什么没有,当然也可以无需进行检查,直接mount,最多也只是提示个“mount: xxx already mounted or xxx busy”的错误而已,反正不管怎样做,之后再进行insmod gtp.ko后,我们的Kgtp内核跟踪调试接口/sys/kernel/debug/gtp就有了:

    1
    2
    3
    [root@localhost kgtp]# insmod gtp.ko
    [root@localhost kgtp]# ls /sys/kernel/debug/gtp
    /sys/kernel/debug/gtp

    3.2,本地跟踪
    直接看命令如下,由于系统提供的GDB不支持python,也就是提示如下:

    1
    2
    3
    4
    [root@localhost ~]# gdb
    (gdb) python print 1
    Python scripting is not supported in this copy of GDB.
    (gdb)

    所以,我这里自己编译了一个从GDB官网下载的最新的GDB,Kgtp开源项目作者还提供了一个专门针对Kgtp有特别帮助的GDB变种gdbt,不过我这里先不去管它:

    1
    2
    3
    4
    5
    6
    [root@localhost ~]# cd /usr/src/linux-2.6.36/
    [root@localhost linux-2.6.36]# ~/gdb-7.3.1/gdb/gdb vmlinux
    (gdb) target remote /sys/kernel/debug/gtp
    Remote debugging using /sys/kernel/debug/gtp
    0x0000000000000000 in ?? ()
    (gdb)

    试一下打印内核全局变量如下,这说明我们的Kgtp起效果了。

    1
    2
    3
    4
    5
    6
    7
    (gdb) p jiffies_64
    $1 = 4296250220
    (gdb) p jiffies_64
    $2 = 4296252449
    (gdb) p jiffies_64
    $3 = 4296254936
    (gdb)

    4,总结:
    关于Kgtp的更多用法,比如远程跟踪、离线跟踪、条件跟踪等可以直接参考项目主页的帮助文档,我就不再赘述。下面主要说一下Kgtp能做什么,不能做什么,这才是我们最关注的重点。
    首先,我们要知道Kgtp提供的是trace而不是break,正因为这样,Kgtp才能不干扰中断内核的正常运行,也正因为这样,Kgtp只能做信息的采集功能,而不能做内核或模块的单步调试。那么具体来说,Kgtp提供的优点以及能够做的事情主要包括:
    4.1,简单独立
    这个是最重要的,简单才方便我们去使用它。Kgtp以单独模块存在,想使用时直接insmod,调试完毕时rmmod即可。同时,Kgtp不干扰中断内核的正常运行,将对内核的影响缩减到最小。
    4.2,查看当前系统全局变量
    前面已经看到如何利用Kgtp打印当前的内核变量jiffies_64,那么其它内核变量也类似打印出来,这在我们需要调试内核时有用,无需再去写个模块printk一下或其它变通办法。
    4.3,帮助我们调试模块
    模块执行出现异常,我们最常用的调式办法是在认为合适的地方加上printk查看对应的变量,发现第一次printk没放对地方或是需要查看的变量值却没有去printk,这时只能换个地方或修改对应的printk,改动和编译耗费不少时间,而通过Kgtp就比较方便。我们只需通过Gdb命令修改对应的变量信息收集即可。另外,Kgtp支持条件设置跟踪点,方便收集与统计更有针对性。
    4.4,系统性能瓶颈分析
    这才是Kgtp的强项,除了其提供了大量的自定义状态变量,更可以通过GDB scripts编写复杂的信息统计逻辑,方便提供分析,这点对做服务器运维的童鞋在进行系统性能分析时应该特别有用。

     http://code.google.com/p/kgtp/wiki/HOWTOCN#什么是KGTP

  • 相关阅读:
    Asp.net web服务处理程序(第六篇)
    Asp.net 处理程序(第五篇)
    HttpApplication实战大文件上传 (第四篇)
    HttpApplication处理对象与HttpModule处理模块 (第三篇)
    Asp.net管道 (第二篇)
    HTTP -> Asp.net (第一篇)
    C# 计划任务
    认识元数据和IL(下)<第五篇>
    认识元数据和IL(中)<第四篇>
    认识元数据和IL(上) <第三篇>
  • 原文地址:https://www.cnblogs.com/ahuo/p/2632227.html
Copyright © 2011-2022 走看看