You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用lx-symbols调试内核模块遇gdb.MemoryError问题求助

内核模块调试:lx-symbols内存访问错误与断点失效问题解决

问题场景

调试4.9.88版本内核模块(运行在qemu_imx6ul环境)时,执行lx-symbols触发内存访问错误,同时模块函数(如open)的断点无法生效。相关错误及系统信息如下:

执行lx-symbols的错误日志

(gdb)lx-symbols
loading vmlinux
Traceback (most recent call last):
File "/home/hlleng/linux/imx6ull/100ask_imx6ull-qemu/linux-4.9.88/scripts/gdb/linux/symbols.py",line 163,in invoke
self.load_all_symbols()
File "/home/hlleng/linux/imx6ull/100ask_imx6ull-qemu/linux-4.9.88/scripts/gdb/linux/symbols.py",line 150,in load_all_symbols
[self.load_module_symbols(module)for module in module_list]
File "/home/hlleng/linux/imx6ull/100ask_imx6ull-qemu/linux-4.9.88/scripts/gdb/linux/symbols.py",line 110,in load_module_symbols
module_name = module['name'].string()
gdb.MemoryError:Cannot access memory at address 0x7f00040c
Error occurred in Python:Cannot access memory at address 0x7f00040c
(gdb)c
Continuing.

系统已加载模块信息

[root@qemu_imx6ul:/mnt]# cat /proc/modules 
hello_drv_cdev 2631 0 - Live 0x7f000000 (O)

内核启动参数

已添加nokaslr:

[root@qemu_imx6ul:/mnt]# cat /proc/cmdline 
nokaslr console=ttymxc0,115200 rootfstype=ext4 root=/dev/mmcblk1  rw rootwait init=/sbin/init  loglevel=8

已执行add-auto-load-safe-path vmlinux-gdb.py,GDB支持lx系列命令,但问题仍未解决。


解决步骤

1. 手动加载模块符号替代lx-symbols

跳过自动加载逻辑,直接指定模块符号文件和加载地址(地址取自/proc/modules):

add-symbol-file /path/to/your/hello_drv_cdev.ko 0x7f000000

注意:路径需为宿主机上编译生成的.ko文件绝对路径,确保未被strip去除调试信息。

2. 验证内核与模块的编译一致性

  • 确保模块与当前调试的vmlinux来自同一源码、同一编译配置,内核配置需开启CONFIG_DEBUG_INFO=y,模块编译时不要添加strip参数。
  • 检查调试段完整性:
    readelf -S vmlinux | grep debug
    readelf -S hello_drv_cdev.ko | grep debug
    
    确认输出中存在.debug_info、.debug_line等调试相关段。

3. 规范GDB连接与脚本加载顺序

  • 启动QEMU时必须开启调试端口并暂停CPU:
    qemu-system-arm -machine imx6ull -kernel zImage -dtb imx6ull-14x14-evk.dtb -sd rootfs.ext4 -s -S
    
    -s等价于-gdb tcp::1234,-S表示等待GDB连接后再启动内核。
  • GDB连接时按以下顺序操作:
    # 先加载内核符号文件
    file /path/to/your/vmlinux
    # 连接QEMU调试端口
    target remote :1234
    # 手动加载内核GDB脚本
    source /home/hlleng/linux/imx6ull/100ask_imx6ull-qemu/linux-4.9.88/scripts/gdb/vmlinux-gdb.py
    

4. 检查内存地址可访问性

在GDB中手动读取模块地址,确认是否真的无法访问:

# 读取模块起始地址的内存
x/10x 0x7f000000
# 读取错误日志中提到的0x7f00040c地址内容
x/s 0x7f00040c

如果确实无法读取,需检查QEMU内存配置,确认0x7f000000属于内核虚拟地址范围,可通过查看内核System.map文件验证。


内容的提问来源于stack exchange,提问作者Leng Cold

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 17:01:21