Blog icon indicating copy to clipboard operation
Blog copied to clipboard

使用QEMU调试内核和调试QEMU本身

Open jason--liu opened this issue 5 years ago • 0 comments

调试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命令才可以运行内核。 Selection_002 如上图所示就可以调试内核了。

在虚拟机中挂载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_KERNELCONFIG_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

后面的调试方法就和前面一样了。

参考资料

QEMU使用手册 利用Qemu + Buildroot 进行内核源码级调试 qemu+gdb调试内核

jason--liu avatar Dec 26 '19 10:12 jason--liu