Linux
分类: LINUX
2012-03-29 20:18:20
kgtp使用总结
1,介绍:
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编写复杂的信息统计逻辑,方便提供分析,这点对做服务器运维的童鞋在进行系统性能分析时应该特别有用。
转载请保留地址: