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