如何不用vmlinux也能用gdb调试linux内核模块以及调试linux内核?/sys/modules/xxxko/sections add-symbole-file -s .data

本文详细介绍了如何在没有vmlinux的情况下,利用GDB调试Linux内核模块。通过理解elf文件、内存映射和内核模块的实际地址,结合/sys/modules/xxx/sections下的隐藏文件,可以实现对内核模块的调试。同时,文章还探讨了GDB加载elf文件的原理,并提供了具体的GDB操作步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


第一部分 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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值