首页 > *nix技术, 跟踪调试 > kgtp使用总结

kgtp使用总结

2011年11月22日 发表评论 阅读评论 8,199 次浏览

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

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即可:

[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是否包含有如下两行:

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

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

[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就有了:

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

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

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

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

[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起效果了。

(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://www.lenky.info/archives/2011/11/296http://lenky.info/?p=296


备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。

法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以Email或书面等方式告知,本站将及时删除相关内容或链接。

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.