linux内核调试环境搭建步骤

linux内核调试环境搭建步骤

linux 2.6.26 与其后的版本,其内置已经支持kgdb了。



下面的内容描述了怎样在Linux环境下,搭建虚拟机调试linux内核的主要步骤:我的环境是Ubuntu10.4+VirtualBox(linux2.6.32.16内核源码)。

一、安装VirtualBox以及目标机Linux
这里目标机用来做测试环境,根据具体开发需要,可以灵活选取,由于我主要打算来调试内核模块,所以我只安装了一个最基本的命令行Debian,只开了SSH服务(以便直接SSH连接上去),安装好后vdi文件大致900多M。

二、安装VirtualBox增强工具共享文件
首先在虚拟机主菜单-设备->分配光驱->选中VboxGuestAdditionas.iso
挂载到目录(我的不能自动加载:-():
mount -t iso9660 /dev/cdrom /media/cdrom
执行安装VBoxLinuxAdditions-x86.run,如果提示错误可能是没有编译环境或者对应的kernel头文件,apt安装即可
重启lsmod 看看Vboxsf有没有起来

三、下载内核源码并编译
下载内核源码到开发机的目录 ~/projects/linux-2.6.32.16.tar.bz2
使用Virtualbox将该目录设置为共享、名称为projects,在目标机/etc/fstab
加入projects /mnt/projects vboxsf rw 0 0
解压源码到目标机/usr/src目录,
参考http://linux.vbird.org/linux_basic/0540kernel.php#config_mrproper
注意:kernel-hacking选项里面的
[*] Compile the kernel with debug info
[*] Compile the kernel with frame pointers
[*] KGDB: kernel debugging with remote gdb
最后确保你编译的内核可以启动你的系统

四、设置kgdb串口调试
1、目标机grub menu.1st设置新启动内核选项
Kernel /boot/vmlinuz-2.6.32.16 root=/dev/sda1 ro kgdboc=ttyS0,115200 kgdbwait
2、将目标机编译产生的原始vmlinux文件(好大阿)通过共享复制开发机源码下
3、设置VirtualBox串口使用命名管道Host Pipe Create Pipe (~/serial1)
4、mkfifo ~/serial1
5、socat -d -d ~/serial1 pty:
6、启动虚拟机并进入kdgb串口调试选项,屏幕显示waiting连接
7、启动gdb串口调试
~/projects/linux-2.6.32.16$ gdb vmlinux<-vmlinux是编译产生的原始内核
(gdb)set remotebaud 115200
(gdb)target remote /dev/pts/2 <-参考socat输出




一 安装linux虚拟机

1 在vmware上安装新的linux虚拟机.创建一个新的虚拟机,并一定要用IDE硬盘

2 从Internet下载源代码
1、linux-2.6.18(www.kernel.org -ftp站点)
2、kgdb-2.6.18 patch
3、gdbmod-2.4(可选):调试module使用此gdb

3 编译内核
a、将kgdb-2.6.18补丁打到Linux内核源码里。注意按照顺序打patch,因为此版本的patch是散的,需要手动一个一个添加,共12个文件。

b、编译内核(make clean , make mrproper, make menuconfig, make, make modules , make modules_install, make install)

在内核配置菜单的Kernel hacking选项中选择kgdb调试项,例如:
[*] KGDB: kernel debugging with remote gdb
[*] KGDB: Console messages through gdb
Method for KGDB communication (KGDB: On generic serial port (8250)) --->
< > KGDB: On ethernet
[*] Simple selection of KGDB serial port
(115200) Debug serial port baud rate
(0) Serial port number for KGDB

在device drivers选择项中选择kgdb相关项,例如
Character devices-->
KGDB: On generic serial port(8250)

c、安装gdbmod-2.4

4 修改grub.conf
例如:
title Fedora Core (2.6.16)
root (hd0,0)
kernel /vmlinuz-2.6.16 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.16.img

改为:
title Fedora Core (2.6.18)
root (hd0,0)
kernel /vmlinuz-2.6.18 ro root=/dev/VolGroup00/LogVol00 kgdb8250=0,115200 (kgdbwait)
initrd /initrd-2.6.18.img

5 请检验新编译的内核是否可用。如果不能启动,可能是编译选项没有选好。如果没有问题,关闭这个linux虚拟机,进入下一步。

二 Clone linux虚拟机(请参考vmware手册)

1 Clone linux.在vmware上选择刚安装的linux虚拟机,然后vmware的clone方式。建议选择链接copy.

2 两台虚拟机:一台作target机,一台作develop机。

3 配置两台虚拟机串行通信
a、在每个虚拟机中分别添加一个串口设备,并配置成命名管道 \\.\pipe\com_1

b、指定target虚拟机的串口为server端,并选择"The other end is a virtual machine"属性,对于IO mode属性,选中"Yield CPU on poll"复选择框;

c、指定develop虚拟机的串口为client端,并选择"The other end is a virtual machine"属性。

4 注意:这里的delelop的Linux虚拟机不要使用打了kgdb patch的linux系统,否则无法配置串行口。因为kgdb占用了ttyS0口,禁止使用。我这里使用的是2.6.16内核的系统。

三 调试内核(以调试网络功能为例)
1、启动target虚拟机

2、在develop虚拟机的linux-2.6.18源代码目录下,执行下面的命令:
gdb ./vmlinux
(gdb) set remotebaud 115200
(gdb) target remote /dev/ttyS0
(gdb) break ip_rcv
(gdb) c
3、给target 虚拟机发数据包(如ping)

4、现在就像调试应用程序那样调试内核了。
5、kgdb-2.6.18网站上有,但不是打包的,分散的。需要一个个按照顺序Pack,顺序不能错,否则内核编译不过。

你可能感兴趣的:(linux内核调试环境搭建步骤)