第一部分 GDB 调试Linux内核模块
前言
gdb调试linux内核模块,以前需要先用gdb加载vmlinux,然后加载ko,然后进行调试。但是很多时候有些系统无法及时拿到准确的vmlinux,此时该怎么办?
原理
gdb调试原理需要两个东西:
- 调试用的elf文件(需要符号和程序段包括代码段和数据段)
- 调试用的内存(需要动态加载的地址对应的数据获取)
所以如果调试模块,不一定需要vmlinux。
elf文件怎么来?
elf文件本质提供代码段和数据段,代码段提供函数,数据段提供符号和相对地址。
调试用内存怎么来?
结论:从 /proc/kcore来
映射到进程上下文,进程上下文的内核地址空间全局唯一。linux内核模块调试就在内核地址空间。/proc/kcore具有读取实时内核地址内存的能力(需要root权限)
下一步需要解决elf中符号地址是未加载的,如何获取符号真实地址告诉gdb?
获取linux模块符号的真实地址
结论:/sys/module/test/sections/
该目录目录下的隐藏文件 拿到对应.text .data .bss地址加载的实际地址,然后使用gdb的命令将符号地址加载对。
- 查看/sys/module/test/sections/
# ls /sys/module/test/sections/ -a
. .data .gnu.linkonce.this_module __mcount_loc .rodata.str1.