Chinaunix首页 | 论坛 | 博客
  • 博客访问: 167069
  • 博文数量: 71
  • 博客积分: 165
  • 博客等级: 入伍新兵
  • 技术积分: 431
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-17 00:35
文章分类
文章存档

2013年(3)

2012年(68)

分类: LINUX

2012-11-19 13:23:49

内核调试可以通过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) |
给主人留下些什么吧!~~