听群里的弟兄们讨论Linux内核调试神器systemtap的神奇,自己也动手安装下玩玩,参照了前辈们的博客教程,并以此文做个简单的记录。
以下就是安装的过程:
(一)安装elfutils,提供分析调试信息的库函数,及libcap-dev
sudo apt-get install elfutils
sudo apt-get install libcap-dev
(二)安装systemtap
也可以下载最新的源码,手动编译安装,这里是直接通过安装包安装:
sudo apt-get install systemtap
注意:如果安装失败可以尝试apt-get update更新一下源试试,如果遇到依赖问题可以用aptitude install尝试.
(三)第三部安装调试需要的debuginfon
这是最纠结的一步,本来参照网上其他前辈的安装方法是需要找到与自己本机ubuntu内核完全对应的内核debuginfo,而且要求内核版本号和发行次数完全一致。结果在ubuntu官网上找了半天也未果。最后在一位前辈的指引下,尝试另外一种方法。具体来说,就是自己上网下载自己喜欢的内核版本,手动编译内核,再替换本机内核,相当于自己制作debuginfo。
1.git下载最新的内核源码
git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
或者更快的: git clone https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux.git
2.切换到自己喜欢的内核版本,以本机为例
git checkout v3.14.8,之后git show 确认
3.取得.config
最好使用/boot下的原装config,这样升级之后不容易出现问题,但以下选项记得要打开,如果没有打开就make memuconfig打开
CONFIG_DEBUG_INFO
CONFIG_KPROBES
CONFIG_RELAY
CONFIG_DEBUG_FS
CONFIG_MODULES
CONFIG_MODULE_UNLOAD
CONFIG_UPROBES 或者CONFIG_UTRACE
4.make -j N (N为cpu核数,加快编译)
5.make modules
6.make modules_install
7.make install
最后会在/boot目录下生成新内核的config,vmlinuz,initrd.imge和systemmap等。
8.修改grub信息,默认启动最新的内核
第一步,修该/etc/default/grub中的GRUB_DEFAULT一行,GRUB_DEFAULT="M>N",M为第几个menuentry,N为该menuentry第几个submenu,一定注意加引号。
第二步,update-grub.
9.reboot之后,成功了会进入新内核。
(四)验证systemtap是否安装成功
stap -e 'probe kernel.function("sys_open") {log("hello world") exit()}'
工欲善其事,必先利其器,可以好好玩systemtap了,以后文章会介绍systemtap的调试内核的一个bug.