Blog
Blog copied to clipboard
使用QEMU调试内核和调试QEMU本身
调试QEMU本身
为了调试QEMU,可以下载一个精简的镜像。 wget http://wiki.qemu.org/download/linux-0.2.img.bz2
启动GDB,开始调试
方法一
gdb --args qemu-system-x86_64 -enable-kvm -m 4096 -smp 4 linux-0.2.img
这种方法有个缺点,就是只能调试qemu的启动过程,当qemu启动完后,或者说Guest OS启动完成后,就无法在终端中输入GDB命令了。
方法二
可以使用另外一种方式来调试启动完成的qemu。 首先找到qemu进程PID。
ps -A | grep qemu
在QEMU源码目录下执行如下命令:
sudo gdb -p 9527 //假设qemu PID为9527
但是这种方式我好像没试验成功。/(ㄒoㄒ)/~~
使用QEMU调试内核
首先在正常启动Guest OS命令行后面加-s -S
$workdir/qemu/bin/qemu-system-arm -M mcimx6ul-evk -m 512M -kernel /work/tools/100ask_imx6ull-qemu/linux-4.9.88/arch/arm/boot/zImage
-dtb $workdir/imx6ull-system-image/100ask_imx6ull_qemu.dtb
-nographic -serial mon:stdio
-drive file=$workdir/imx6ull-system-image/rootfs.img,format=raw,id=mysdcard -device sd-card,drive=mysdcard
-append "console=ttymxc0,115200 rootfstype=ext4 root=/dev/mmcblk1 rw rootwait init=/sbin/init loglevel=8"
-nic user -s -S
-s是“-gdb tcp::1234”的缩写,表示QEMU将会在本机端口1234上开启gdbserver。
-S表示不启动CPU,当使用arm-xxx-gdb连接上QEMU后,必须执行c命令才可以运行内核。
如上图所示就可以调试内核了。
在虚拟机中挂载NFS
安装NFS服务
sudo apt-get install nfs-kernel-server
修改/etc/exports添加
/work/nfs *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
重启NFS服务
sudo /etc/init.d/nfs-kernel-server restart
在Ubuntu本机验证
sudo mount -t nfs -o nolock,vers=3 127.0.0.1:/work/nfs /mnt
ls /mnt
同样的在虚机中挂载NFS
mount -t nfs -o nolock,vers=3 10.0.2.2:/work/nfs/nfs_rootfs /mnt
buildroot编译适合qemu镜像
可以使用buildroot编译qemu镜像,比较方便。
cd buildroot/
$ make list-defconfigs // 列出所有buildroot支持的平台的默认编译。
$ make qemu_x86_64_defconfig // Build for qemu_x86_64
$ make linux-menuconfig // 打开内核编译选项
为了能支持gdb调试内核,需要打开CONFIG_DEBUG_KERNEL
和CONFIG_DEBUG_INFO
编译完成后会生成下面的文件
➜ images git:(2019.11.x) ll
total 8.1M
-rw-r--r-- 1 jason jason 4.2M 12月 27 10:01 bzImage
-rw-r--r-- 1 jason jason 60M 12月 27 10:09 rootfs.ext2
启动虚机器
qemu-system-x86_64 -m 5120 -smp 4 -M pc -kernel output/images/bzImage -drive file=output/images/rootfs.ext2,if=virtio,format=raw -append root=/dev/vda -net nic,model=virtio -net user -s -S
后面的调试方法就和前面一样了。