怎样使用qemu+kgdb调试linux系统

利用qemu+kgdb调试Linux系统

author:Ewan

  1. 在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编译该内核。

  1. 将Guest中的内核源码目录传输到Host上,因为之后gdb要从该目录启动,使用该目录的vmlinux,我使用的传输媒介为网桥,需要配置网桥,配置网桥方案见文档"qemu使用网桥模式"
  2. 利用qemu启动Guest
sudo qemu-system-x86_64 -smp 4 -m 4096 -hda ubuntu18_04.img -enable-kvm -serial tcp::1234,server,nowait
  1. 在Guest的启动选项中,选择Advanced Options,然后在需要debug的kernel版本上按e,编辑该内核的启动项,加入:
kgdbwait kgdboc=ttyS0,115200 nokaslr

然后按F10, 启动该内核。

  1. 在Host上,之前从Guest传输过来的内核源码目录下,启动gdb
gdb -ex 'file vmlinux' -ex 'target remote localhost:1234'

然后在gdb中,输入c,并回车

  1. 在Guest中,输入
sudo echo g > /proc/sysrq-trigger

然后就会发现Guest卡住了,回到Host看gdb所在的terminal,发现gdb可以操作了,之后就可以使用该gdb对内核进行debug了。

posted @ 2021-02-24 13:01  EwanHai  阅读(893)  评论(0编辑  收藏  举报