内核调试可以通过printk, proc, strace及kgdb等调试方法调试,下面介绍内核源码级的调试工具kgdb的使用。
kgdb 调试需要两台机器进行远程调试,一台开发机,一台目标机,通过串口通信,开发机使用gdb控制目标机的
kgdb进行内核源码级调试。
先从源安装
systemtap
sudo apg-get install systemta;
. 由于ubuntu 桌面版默认没有安装kernel-debug-info,所以安装了systemtap后仍然不能够追踪内核信息,因此需要手动安装kernel-debug-info包。
(1)查看当前内核版本
$ uname -ar (2)下载对应内核版本的debug-info package
这里下载
linux-image-3.0.0-15-generic-dbgsym_3.0.0-15.24_i386.ddeb将下载好的kernel-debug-info包拷贝到目标机
dpkg -i
linux-image-3.0.0-15-generic-dbgsym_3.0.0-15.24_i386.ddeb安装成功 查看其安装目录地址:
dpkg -L linux-image-3.0.0-15-generic-pae-dbgsym
一般安装在 /usr/lib/debug/目录下面
cd /usr/lib/debug
进入该目录下面的./boot目录
cd ./boot
拷贝该目录下的 vmlinuz-3.2.0-23-generic-pae到开发机。
在目标机加一条tcp串口。
重启目标机,并修改其grub启动项,
linux
/boot/vmlinuz-2.6.34.1-kgdbroot=UUID=78727361-022c-4790-8d39-a17565a4e155
ro rootdelay=90quiet splash text kgdboc=ttyS1,115200 kgdbwait
此时目标机处于启动等待状态
开发机运行 gbd -q vmlinuz-3.2.0-23-generic-pae(之前拷贝过来的vm文件)
进入gbd界面
运行命令: target remote tcp:localhost:4555 (因为我用的是tcp串口,4555为端口号)。
连接成功后,运行contue命令,目标机会继续进入运行状态。
在目标机运行 echo g > /proc/sysrq-trigger, 重新使目标机挂起,进入调试状态,开发机进入gdb命令行。
因为当前内核使用了write protect 选项,不支持断点,需重新编译内核。
重新编译内核使用kgdb
下载与操作系统版本相近的内核源代码,将系统的.config文件拷贝到源代码顶层目录下。
# make menuconfig
选择进入Kernel hacking --->
[*] Compile the kernel with debug info (选择该配置选项)
[*] KGDB: kernel debugger --->
[ ] Write protect kernel read-only data structures (去除该选项)
[ ] Set loadable kernel module data as NX and text as RO
保存配置,退出
编译内核代码
#make
生成modules
#make modules
安装modules
#make modules_install
安装内核
#make install
完成以上步骤后,接下来重启机器,将代码顶层目录下的vmlinux拷贝到开发机上。
如对模块进行调试,如对habd.ko进行调试:
1.在目标机插入模块。
#insmod habd.ko
2.查看module的.text地址
# cat /sys/module/habd/sections/.text
0xf8457000
3.将目标机的源代码及所生成的habd.ko等文件拷贝至开发机
#tar -cf habd.tar.gz ./habd
#scp habd.tar.gz tw@host:ip(欲拷贝主机的主机名或者ip地址):~/
4.进入开发机的habd模块目录,将之前生成vmlinux文件拷贝至该目录,执行如下操作
# gdb -q vmlinux
Reading symbols from /home/tw/habd/vmlinux...done.
(gdb) target remote tcp:localhost:4555 (因为我用的是tcp串口,4555为端口号)
(需目标机处于停止状态,即echo g > /proc/sysrq-trigger, 让其挂起)
(gdb) add-symbol-file ./habd.ko 0xf8457000
add symbol table from file "./habd.ko" at
.text_addr = 0xf8457000
(y or n) y
Reading symbols from /home/tw/habd/habd.ko...done.
(gdb)
5.查看模块的符号表信息
#nm habd.ko
根据符号表中的信息在程序中打段点,接下来操作与应用层gdb相同。
阅读(2073) | 评论(0) | 转发(0) |