在VMware中用Kgdb调试linux内核

1,在vmware中安装Ubuntu 10.04 LTS,该虚拟机命名为client
2,在unbuntu中手动安装ncurses-6.0.tar.gz
3,make menuconfig 设置编译选项
make menuconfig 
File System --> 下面把ext3,ext2都编译进内核(就是把前面的M变成*) 
Kernel Hacking --> 
      1,选中Compile the kernel with frame pointers 
      2,选中KGDB:kernel debugging with remote gdb 
      3,选中[*] KGDB: kernel debugger  ---> 
        <*>   KGDB: use kgdb over the serial console
      4,并确认以下两项也是选中的(他们应该默认是选中的) 
      > kernel debugging 
      > Compile the kernel with debug info

      5,去掉Writeprotect kernel read-only data structures(否则不能用软件断点)

4,在client虚拟机中编译内核以及内核模块
编译内核:
make -j10 bzImage 
-j10表示使用10个线程进行编译. 
内核模块:
make modules 

5,使用vmware的clone功能新建一个ubuntu虚拟机,命名为server。

6,在server的虚拟机中安装内核

make modules_install 
安装内核模块 
make install 

安装内核

7,在server的虚拟机中使用下边的命令生成initrd.img-2.6.36

mkinitramfs-kpkg -o initrd.img-2.6.36 2.6.36

8,添加串行端口

在client端添加串口,类型选Use named pipe:
\\.\pipe\com_1
Thisend is the client
Theother end is a virtual machine
在server端添加抽口,功能选Usenamed pipe:
\\.\pipe\com_1

Thisend is the server

9,在server的虚拟机中用下边的命令生成vmlinuz

cp arch/i386/boot/bzImage  /boot/vmlinuz-2.6.36-kgdb

10,在server的虚拟机中,相关文件的拷贝

将生成的System.map和
initrd.img拷贝到/boot下,重新命名为
System.map-2.6.34.1-kgdb
vmlinuz-2.6.34.1-kgdb
initrd.img-2.6.34.1-kgdb
运行update-grub

11,在server的虚拟机中,修改配置文件

vi /etc/default/grub
vi /boot/grub/grub.cfg
/etc/default/grub修改如下:
GRUB_DEFAULT=0 //设定默认启动项
#GRUB_HIDDEN_TIMEOUT=30 //注释掉这行会显示引导菜单
GRUB_HIDDEN_TIMEOUT_QUIET=false //如果为true,黑屏且不会显示倒计时
GRUB_TIMEOUT=30 //倒计时
GRUB_DISTRIBUTOR=`lsb_release -i-s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="rootdelay=90 quiet splash text" //text表示命令行方式启动
GRUB_CMDLINE_LINUX=""
/boot/grub/grub.cfg修改如下:
### BEGIN /etc/grub.d/10_linux###
menuentry 'Ubuntu, with Linux2.6.36-kgdb' --class ubuntu --class gnu-linux --class gnu --classos {
recordfail
insmod ext2
set root='(hd0,1)'
search --no-floppy --fs-uuid--set 78727361-022c-4790-8d39-a17565a4e155
linux /boot/vmlinuz-2.6.36-kgdbroot=UUID=78727361-022c-4790-8d39-a17565a4e155 ro rootdelay=90 quiet splash text kgdboc=ttyS1,115200 
initrd /boot/initrd.img-2.6.36-kgdb
}

12,server选择kgdb启动,
登录后echog > /proc/sysrq-trigger
开启kgdb
Server上显示:
SysRq:DEBUG

Entering KGDB

13,client中运行gdb vmlinux以后,

输入:

set remotebaud 115200

target remote /dev/ttyS1

然后设置断点,然后执行

break sys_init_module

continue

14,insmod cramfs.ko

参考了下边的一些博客

http://www.xuebuyuan.com/1796014.html

http://blog.chinaunix.net/uid-20672257-id-2936794.html

你可能感兴趣的:(linux,debug)