如何使用QEMU调试Linux内核模块?

How to debug Linux kernel modules with QEMU?

我正在从事学术项目,该项目修改了一些Kernel Networking代码并包括了一个新的Kernel module

我正在使用QEMU加载修改后的内核并进行测试。

但是,我发现在某些.img中需要完整的OS进行调试。
没有它可能吗?

或者,这是可以与Kernel 2.6一起用于系统的发行版。 除了运行程序的功能(包括网络支持)外,发行版不需要具有任何功能。


我认为最简单的方法是使用buildroot
http://buildroot.uclibc.org/

克隆它,将其配置为使用您的自定义内核(默认用户空间适合开始使用,您可能以后需要更改它)。

它将构建您的内核和根文件系统。整个过程大约需要半个小时,其中二十分钟是在编译怪物

我的跑步路线看起来像:
qemu-system-i386
-hda rootfs.ext2
-内核bzImage
-m 512M
-附加" root = / dev / sda console = ttyS0"
-当地时间
-串行stdio

以及有关分接头设备的更多选项


最少的全自动QEMU + GDB + Buildroot示例

非模块Linux内核上的QEMU + GDB详细介绍:如何使用GDB和QEMU调试Linux内核?并在QEMU中构建内核模块,方法如下:如何将Linux驱动程序添加为Buildroot软件包。

接下来,我还在以下位置进行了自动化的GDB模块调试:https://github.com/cirosantilli/linux-kernel-module-cheat/tree/1c29163c3919d4168d5d34852d804fd3eeb3ba67#kernel-module-debugging

这些是您必须采取的主要步骤:

  • 用调试符号编译内核模块:

    1
    ccflags-y += -g -DDEBUG

    如以下内容所述:内核模块未找到调试符号

  • 使用Ctrl + C停止GDB并运行:

    1
    lx-symbols path/to/parent/of/modules/

    这个惊人的命令是在Linux内核源代码树中的GDB Python脚本中定义的,每当GDB停止时,它将自动递归地加载给定目录下存在的已加载模块的符号。

    使该命令可用的最佳方法是使用:

    1
    gdb -ex add-auto-load-safe-path /full/path/to/linux/kernel

    如以下内容所述:GDB:lx-symbols undefined命令

  • insmod内核模块。

    必须在设置断点之前完成此操作,因为我们不知道内核将模块预先插入内存的位置。

    lx-symbols自动为我们查找模块位置(在主机文件系统和来宾内存中!)。

  • Ctrl + C再次断开GDB,设置断点,然后享受。

  • 如果感觉很顽固,还可以完全放弃lx-symbols,并使用以下命令找到insmod之后的模块位置:

    1
    cat /proc/modules

    然后使用以下命令手动添加.ko

    1
    add-symbol-file path/to/mymodule.ko 0xfffffffa00000000