使用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
相关产品推荐
相关产品推荐

