How to debug Linux kernel modules with QEMU?
我正在从事学术项目,该项目修改了一些
我正在使用QEMU加载修改后的内核并进行测试。
但是,我发现在某些
没有它可能吗?
或者,这是可以与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 |
如以下内容所述:内核模块未找到调试符号
使用
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命令
必须在设置断点之前完成此操作,因为我们不知道内核将模块预先插入内存的位置。
用
如果感觉很顽固,还可以完全放弃
1 | cat /proc/modules |
然后使用以下命令手动添加
1 | add-symbol-file path/to/mymodule.ko 0xfffffffa00000000 |