使用QEMU + (K)GDB调试Linux内核——一些疑惑和疑问

使用QEMU + (K)GDB调试Linux内核——一些疑惑和疑问

我正在尝试通过 QEMU 调试 Linux 内核(v3.13)。我在用,作为参考。由于我的主机是 Linux Mint Victoria,因此尝试编译 v3.13(大约 2014 年)的内核和 rootfs 太麻烦了。

这就是为什么我求助于使用 docker 容器来获取 Ubuntu Trust Tahr,如下所示:

mkdir docker
FROM ubuntu:14.04" > docker/Dockerfile
RUN apt-get update && apt-get install -y vim wget unzip bc git python rsync build-essential libncurses5-dev locales" >> docker/Dockerfile
docker build --tag "ubuntu-trusty" docker/

进入容器后,我克隆 buildroot,签出 tag 2014/08。然后我让 buildroot 为我构建内核(v3.13.5)。这是我的构建根目录配置和内核配置选项。

仅供参考,我选择将 rootfs 集成到内核中作为 initramfs如上所述这里。完成后,我会看到一个rootfs.cpio存档和一个bzImageunder output/images。一切完成后,我将像这样调用 qemu:

sudo qemu-system-x86_64 --enable-kvm -serial tcp::1234,server,nowait -m 512M -kernel ./bzImage -append "kgdbwait kgdboc=ttyS0,115200 nokaslr ip=dhcp" -net nic,model=virtio -device virtio-blk,drive=drive0 -drive file=./disk.img,format=raw,if=none,id=drive0

这将打开一个新窗口,其中显示启动日志并最终运行 getty 进程,允许我登录。所以这是我的查询

  1. 如果我转到-nographicQEMU,我不会看到登录提示。为什么?
  2. 如果我使用-swhich相当于-gdb tcp:1234,gdb客户端似乎无法正确连接到它(与我使用时相比,它在内核中的不同位置中断-serial tcp::1234,server,nowait);虽然 qemu 显然已暂停,正在等待来自远程 gdb 的连接
  3. 我已经创建了一个像这样的 ext2 映像qemu-img create disk.img 10G && mkfs.ext2 -F disk.img,但我不确定它是否在启动过程中被附加/检测到。机器启动后如何检查?

答案1

这个问题的疑问太多了。我要回答#2。

虽然-s-gdb tcp::1234是等价的,但-serial tcp::1234,server,nowait正在做某事完全不同

前两个选项(-s以及等效选项-gdb tcp::1234)是指导性的盖姆监听调试器连接。

该选项-serial tcp::1234,server,nowait只是告诉 qemu 将虚拟机串行端口连接到 TCP 套接字。就其本身而言,它与调试无关。

但...

如果您已将内核配置为支持 KGDB,并且已设置kgdboc=ttyS0,115200,那么您的核心正在侦听串行端口上的 gdb 连接。

两种机制都允许您使用 来调试内核gdb,但第一种机制是利用 qemu 中的调试功能,而后者则要求您在内核中启用 kgdb 支持。

相关内容