怎样使用qemu+kgdb调试linux系统
利用qemu+kgdb调试Linux系统
author:Ewan
- 在Guest上编译并安装需要debug的内核,需要将以下选项加入编译配置中。
CONFIG_DEBUG_KERNEL=y
CONFIG_DEBUG_INFO=y
CONFIG_CONSOLE_POLL=y
CONFIG_KDB_CONTINUE_CATASTROPHIC=0
CONFIG_KDB_DEFAULT_ENABLE=0x1
CONFIG_KDB_KEYBOARD=y
CONFIG_KGDB=y
CONFIG_KGDB_KDB=y
CONFIG_KGDB_LOW_LEVEL_TRAP=y
CONFIG_KGDB_SERIAL_CONSOLE=y
CONFIG_KGDB_TESTS=y
CONFIG_KGDB_TESTS_ON_BOOT=n
CONFIG_MAGIC_SYSRQ=y
CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1
CONFIG_SERIAL_KGDB_NMI=n
注意:
理论上也可以通过在Host上编译内核(因为Guest上的编译实在是太慢了),然后将整个源码目录拷贝到Guest中去,再进行安装。但是经过实验,这样操作会导致新编译的内核无法启动,不知道哪里出了问题。
以上选项加入编译配置肯定没有问题,但我在5.3.8的编译中,使用默认选项(5.3.8默认使能了KGDB),也能最终使用KGDB编译该内核。
- 将Guest中的内核源码目录传输到Host上,因为之后gdb要从该目录启动,使用该目录的vmlinux,我使用的传输媒介为网桥,需要配置网桥,配置网桥方案见文档"qemu使用网桥模式"。
- 利用qemu启动Guest
sudo qemu-system-x86_64 -smp 4 -m 4096 -hda ubuntu18_04.img -enable-kvm -serial tcp::1234,server,nowait
- 在Guest的启动选项中,选择Advanced Options,然后在需要debug的kernel版本上按e,编辑该内核的启动项,加入:
kgdbwait kgdboc=ttyS0,115200 nokaslr
然后按F10, 启动该内核。
- 在Host上,之前从Guest传输过来的内核源码目录下,启动gdb
gdb -ex 'file vmlinux' -ex 'target remote localhost:1234'
然后在gdb中,输入c,并回车
- 在Guest中,输入
sudo echo g > /proc/sysrq-trigger
然后就会发现Guest卡住了,回到Host看gdb所在的terminal,发现gdb可以操作了,之后就可以使用该gdb对内核进行debug了。