vmware虚拟机搭建Kgdb环境
参考internet上的一篇文章《VMware下搭建kgdb环境》,我在SUSE11环境下进行试验。
一、 系统环境:
1、VMware版本6.5。
2、两台虚拟机,均为suse11操作系统,运行内核为2.6.32
二、虚拟机配置:
被调试的系统为server(target machine),调试的系统为client(development machine),在关机状态下,为两台系统各添加一个串口Serial Port,注意创建虚拟机的时候可能会需要手动add Serial设备。
Server端配置:
|
client端配置:
|
串口设置完毕,然后开机进入系统,在server的终端输入:cat /dev/ttyS0 .
在client的终端输入echo hello > /dev/ttyS0,
如果server上显示hello,说明串口设置成功。
在client的终端输入echo hello > /dev/ttyS0,
如果server上显示hello,说明串口设置成功。
三、client端编译内核(选上kgdb选项)。
此步的目的是为了把kgdb功能编译进内核,因为正在运行的内核中是没有kgdb功能的。
进入client,把内核拷到/work目录下:
cd /work/linux-2.6.32
cp /boot/config-2.6.32.12-0.7-default . //利用原系统的config配置
make clean //清除生成的中间文件
修改Makefile文件中的:EXTRAVERSION = -xhawk(你自己给新内核取的名字)
make menuconfig
•File System --> 下面把ext3,ext2都编译进内核(就是把前面的M变成*)
•Kernel Hacking -->
选中Compile the kernel with frame pointers
选中KGDB:kernel debugging with remote gdb
并确认以下两项也是选中的(他们应该默认是选中的)
选中 kernel debugging
选中 Compile the kernel with debug info
•对于其它选项,请按实际情况,或你的要求定制.
•保存退出
修改编译选项:
make menuconfig
•File System --> 下面把ext3,ext2都编译进内核(就是把前面的M变成*)
•Kernel Hacking -->
选中Compile the kernel with frame pointers
选中KGDB:kernel debugging with remote gdb
并确认以下两项也是选中的(他们应该默认是选中的)
选中 kernel debugging
选中 Compile the kernel with debug info
•对于其它选项,请按实际情况,或你的要求定制.
•保存退出
修改编译选项:
ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
CFLAGS += -O //原来是-Os 这个比 –O2 优化的还厉害呢
else
CFLAGS += -O2
Endif
…
ifdef CONFIG_DEBUG_INFO
CFLAGS += -g -ggdb
Endif
CFLAGS += -O //原来是-Os 这个比 –O2 优化的还厉害呢
else
CFLAGS += -O2
Endif
…
ifdef CONFIG_DEBUG_INFO
CFLAGS += -g -ggdb
Endif
make (编译内核)
make modules_install (安装内核模块)
make install (安装内核)
此时client端已经更新了新的内核,grub文件也改为从新内核启动。
make modules_install (安装内核模块)
make install (安装内核)
此时client端已经更新了新的内核,grub文件也改为从新内核启动。
四、把/work/linux-2.6.32拷贝到server端
scp -r /work/linux-2.6.32 root@192.168.220.132:/srvwork
scp -r /work/linux-2.6.32 root@192.168.220.132:/srvwork
五、给server端安装新内核
cd /srvwork/linux-2.6.32
make modules_install
make install
修改server的menu.lst,增加两个用新内核的启动项目。
• 第一个启动项在原来的基础上添加了kgdb的参数:kgdboc=ttyS0,115200
kgdboc 的意思是 kgdb over console,这里将kgdb连接的console设置为ttyS0,波特率为115200,
kgdboc 的意思是 kgdb over console,这里将kgdb连接的console设置为ttyS0,波特率为115200,
如果不在内核启动项中配置该参数,可以在进入系统后执行命令: echo ttyS0 > /sys/module/kgdboc/parameters/kgdboc
• 第二个启动项,增加参数:kgdboc=ttyS0,115200 kgdbwait参数,kgdbwait 使 kernel 在启动过程中等待 gdb 的连接。
重启server,选择第二个启动项,即kgdbwait项目。
• 第二个启动项,增加参数:kgdboc=ttyS0,115200 kgdbwait参数,kgdbwait 使 kernel 在启动过程中等待 gdb 的连接。
重启server,选择第二个启动项,即kgdbwait项目。
启动后,server端会停留在kgdb:waitting for connection from remote gdb
说明server已经进入调试状态,等待gdb连接
六、调试进入client系统并启动gdb:
cd /work/linux-2.6.32
gdb vmlinux
(gdb) set remotebaud 115200
(gdb) target remote /dev/ttyS0
此时应该能出现:
Remote debugging useing /dev/ttyS0
gdb vmlinux
(gdb) set remotebaud 115200
(gdb) target remote /dev/ttyS0
此时应该能出现:
Remote debugging useing /dev/ttyS0
kgdb_breakpoint() at kernel/kgdb.c 1721
1721 wmb()
类似这样的内容说明连接已经成功。这时你可以像使用本地gdb一样设置断点(break),单步执行(step),或其它命令.
(gdb) continue
执行continue,Server就继续下面的系统初始化了.
执行continue,Server就继续下面的系统初始化了.
系统启动完成后,就可以进行内核的调试了,在server的终端输入:
echo g > /proc/sysrq-trigger
然后系统会中断,进入调试状态,等待远端gdb的连接。
Server进入调试状态后,转换到client系统,重复上面对client的步骤就可以对内核进行调试了。
echo g > /proc/sysrq-trigger
然后系统会中断,进入调试状态,等待远端gdb的连接。
Server进入调试状态后,转换到client系统,重复上面对client的步骤就可以对内核进行调试了。
七、我实践中遇到的问题
SUSE11新内核启动失败,问题如下:
Warning:module /lib/modules/2.6.32/kernel/drivers/hwmon/hwmon.ko is unsupported
Warning:module /lib/modules/2.6.32/kernel/drivers/hwmon/hwmon.ko is unsupported
……
FATAL:module jdb not found
FATAL:module ext3 not found
FATAL:module /lib/modules/2.6.32/kernel/drivers/firmware/edd.ko is unsupported
最后发现是因为在make 之后多用了一次make modules。其实make本身已经包含了make bzImage/make modules;
最后发现是因为在make 之后多用了一次make modules。其实make本身已经包含了make bzImage/make modules;
经验1:通过修改Makeflie设定自己的内核版本,在make install的时候就会保留原来的内核版本
经验2:先把client的内核编译完毕,然后clone整个client,省去了scp需要的大量时间。