使用virtualbox + kgdb调试kernel
主机环境: T400/Ubuntu9.10(2.6.31-21)1、安装VirtualBox, System->Administation->Synaptic Package Manager 查找 virtualbox-ose 等安装2、启动VirtualBox ~$ VirtualBox3、在虚拟机上安装Ubuntu系统,编号 DevMach
·
主机环境: T400/Ubuntu9.10(2.6.31-21)
1、安装VirtualBox,
System->Administation->Synaptic Package Manager
查找 virtualbox-ose 等安装
2、启动VirtualBox
~$ VirtualBox
3、在虚拟机上安装Ubuntu系统,编号 DevMachine //可能要求 sudo rmmod kvm-intel
4、在DevMachine建立基本的开发环境
a 下载与VirtualBox对应版本的VBoxGuestAdditions_3.0.8.iso
http://download.virtualbox.org/virtualbox/
b 将VBoxGuestAdditions_3.0.8.iso放到虚拟机上
c cd /media/cdrom0
d sudo ./VBoxLinuxAdditions-x86.run
e shutdown 虚拟机DevMachine
f 设置好共享文件夹
g start 虚拟机DevMachine
h sudo mkdir /mnt/share; mount -t vboxsf xxx /mnt/share //xxx 共享文件夹名
6、编译调试内核
在2.6.26以前的Linux内核中使用kgdb需要打上补丁,而在2.6.26及以后的内核里已经加入了对kgdb的支持:
1)make menuconfig
进入kernel hacking ,在保证Compile the kernel with debug info被勾上的同时,选中KGDB: kernel debugging with remote gdb
2)make bzImage && make modules
3)sudo make modules_install
4) sudo make install
5) sudo mkinitramfs -o /boot/initrd.img-2.6.31.13 2.6.31.13
7、克隆一目标机 TarMachine //编译好内核后再克隆
VBoxManage clonevdi rhel1.vdi rhel2.vdi //这里如果出错,请用绝对路径
8、设置DevMachine和TarMachine之间的串口通讯
//摘抄自:http://www.xnlinux.cn/thread-968-1-1.html
可以利用主机的命名管道来完成两台虚拟机间的通信。一台虚拟机在主机中创建命名管道并将其串口与管道相连,另外一台虚拟机也将自己的串口连接到主机的命名 管道上,这样就实现了两个虚拟机串口的连接。两台虚拟机都使用自己的COM1端口,主机的命名管道同为/tmp/vbox,在配置时由一台虚拟机创建,另 一台则不创建。我们可使用以下的方式来测试两虚拟机的串口是否连接成功:
(1)首先启动创建管道的虚拟机,再启动另一台虚拟机,然后使用命令stty ispeed 115200 ospeed 115200 -F /dev/ttyS0将各自COM1端口的输入输出波特率都设为115200。
(2)在其中一台虚拟机v1终端上执行cat /dev/ttyS0,在另一台虚拟机v2上执行 echo ok > /dev/ttyS0,这时如果虚拟机v1的终端接受到v2发来的ok消息,则说明两虚拟机的串口通信正常,连接成功。
9、设置grub.cfg
kgdboc=ttyS0,115200 kgdbwait
由于要使用串口来调试内核,所以在grub的内核启动参数上要加上kgdbwait,它的作用是在系统内核启动时停下来等待调试。可使用 kgdboc驱动来改变串口的参数,当内核启动参数为kgdboc=0,115200时,0代表使用串口0(/dev /ttyS0),115200代表波特率是115200。
menuentry "Ubuntu, Linux 2.6.31.13-dbg" {
recordfail=1
if [ -n ${have_grubenv} ]; then save_env recordfail; fi
set quiet=1
insmod ext2
set root=(hd0,1)
search --no-floppy --fs-uuid --set f8b2c18a-98d6-4086-b663-beb12ee9cfab
linux /boot/vmlinuz-2.6.31.13 root=UUID=f8b2c18a-98d6-4086-b663-beb12ee9cfab ro kgdboc=ttyS0,115200 kgdbwait
initrd /boot/initrd.img-2.6.31.13
}
如果启动没有出来grub菜单,按 ESC
10、先启动开发机。然后启动目标机,开机时按Esc建选择有kgdb的内核启动,等待一下后启动过程会暂停并提示等待远程gdb调试,这时切换到开发机并进入到源码目录下,运行
gdb ./vmlinux
gdb启动后,使用以下命令设置波特率和调试终端:
(gdb)set remotebaud 115200
(gdb)target remote /dev/ttyS0
参考: http://linux.chinaunix.net/techdoc/system/2009/04/30/1109589.shtml
http://www.xnlinux.cn/thread-968-1-1.html
1、安装VirtualBox,
System->Administation->Synaptic Package Manager
查找 virtualbox-ose 等安装
2、启动VirtualBox
~$ VirtualBox
3、在虚拟机上安装Ubuntu系统,编号 DevMachine //可能要求 sudo rmmod kvm-intel
4、在DevMachine建立基本的开发环境
$ sudo apt-get install build-essential
$ sudo apt-get install bison
$ sudo apt-get install flex
$ sudo apt-get install gettext
$ sudo apt-get install tcl
$ sudo apt-get install sharutils
$ sudo apt-get install libncurses-dev
5、建立虚拟机DevMachine和主机文件共享a 下载与VirtualBox对应版本的VBoxGuestAdditions_3.0.8.iso
http://download.virtualbox.org/virtualbox/
b 将VBoxGuestAdditions_3.0.8.iso放到虚拟机上
c cd /media/cdrom0
d sudo ./VBoxLinuxAdditions-x86.run
e shutdown 虚拟机DevMachine
f 设置好共享文件夹
g start 虚拟机DevMachine
h sudo mkdir /mnt/share; mount -t vboxsf xxx /mnt/share //xxx 共享文件夹名
6、编译调试内核
在2.6.26以前的Linux内核中使用kgdb需要打上补丁,而在2.6.26及以后的内核里已经加入了对kgdb的支持:
1)make menuconfig
进入kernel hacking ,在保证Compile the kernel with debug info被勾上的同时,选中KGDB: kernel debugging with remote gdb
2)make bzImage && make modules
3)sudo make modules_install
4) sudo make install
5) sudo mkinitramfs -o /boot/initrd.img-2.6.31.13 2.6.31.13
7、克隆一目标机 TarMachine //编译好内核后再克隆
VBoxManage clonevdi rhel1.vdi rhel2.vdi //这里如果出错,请用绝对路径
8、设置DevMachine和TarMachine之间的串口通讯
//摘抄自:http://www.xnlinux.cn/thread-968-1-1.html
可以利用主机的命名管道来完成两台虚拟机间的通信。一台虚拟机在主机中创建命名管道并将其串口与管道相连,另外一台虚拟机也将自己的串口连接到主机的命名 管道上,这样就实现了两个虚拟机串口的连接。两台虚拟机都使用自己的COM1端口,主机的命名管道同为/tmp/vbox,在配置时由一台虚拟机创建,另 一台则不创建。我们可使用以下的方式来测试两虚拟机的串口是否连接成功:
(1)首先启动创建管道的虚拟机,再启动另一台虚拟机,然后使用命令stty ispeed 115200 ospeed 115200 -F /dev/ttyS0将各自COM1端口的输入输出波特率都设为115200。
(2)在其中一台虚拟机v1终端上执行cat /dev/ttyS0,在另一台虚拟机v2上执行 echo ok > /dev/ttyS0,这时如果虚拟机v1的终端接受到v2发来的ok消息,则说明两虚拟机的串口通信正常,连接成功。
9、设置grub.cfg
kgdboc=ttyS0,115200 kgdbwait
由于要使用串口来调试内核,所以在grub的内核启动参数上要加上kgdbwait,它的作用是在系统内核启动时停下来等待调试。可使用 kgdboc驱动来改变串口的参数,当内核启动参数为kgdboc=0,115200时,0代表使用串口0(/dev /ttyS0),115200代表波特率是115200。
menuentry "Ubuntu, Linux 2.6.31.13-dbg" {
recordfail=1
if [ -n ${have_grubenv} ]; then save_env recordfail; fi
set quiet=1
insmod ext2
set root=(hd0,1)
search --no-floppy --fs-uuid --set f8b2c18a-98d6-4086-b663-beb12ee9cfab
linux /boot/vmlinuz-2.6.31.13 root=UUID=f8b2c18a-98d6-4086-b663-beb12ee9cfab ro kgdboc=ttyS0,115200 kgdbwait
initrd /boot/initrd.img-2.6.31.13
}
如果启动没有出来grub菜单,按 ESC
10、先启动开发机。然后启动目标机,开机时按Esc建选择有kgdb的内核启动,等待一下后启动过程会暂停并提示等待远程gdb调试,这时切换到开发机并进入到源码目录下,运行
gdb ./vmlinux
gdb启动后,使用以下命令设置波特率和调试终端:
(gdb)set remotebaud 115200
(gdb)target remote /dev/ttyS0
参考: http://linux.chinaunix.net/techdoc/system/2009/04/30/1109589.shtml
http://www.xnlinux.cn/thread-968-1-1.html
更多推荐
已为社区贡献3条内容
所有评论(0)