使用kgdb调试内核模块遇问题:行号断点失败、TUI显示无源码
kgdb调试内核模块源码加载异常问题解决
问题现象
- 能命中目标函数断点,但kgdb的TUI界面显示
No source available - 执行
(gdb)break <file_name>.c:line_number时,返回No line <line_number> in file "<file_name>.c",并询问是否挂起断点
解决步骤
1. 确保模块编译时生成完整调试信息
编译模块必须开启调试符号并关闭优化,根据编译体系调整:
- 普通Makefile添加参数:
CFLAGS += -g -O0 - 内核Kbuild体系下,编译时传入调试参数:
make -C /lib/modules/$(uname -r)/build M=$(pwd) CONFIG_DEBUG_INFO=y modules
2. 给gdb指定源码路径
启动gdb后,手动添加模块源码所在目录:
(gdb) directory /绝对路径/到/模块源码目录/
也可以写入~/.gdbinit实现自动加载:
set directories /绝对路径/到/模块源码目录/
3. 确认模块状态后设置行号断点
先通过lsmod确认模块已加载至内核,再执行断点命令;若模块未加载,输入y确认挂起断点,模块加载后断点会自动激活。
4. 验证模块调试符号有效性
用objdump检查模块是否包含对应源码的调试信息:
objdump --syms --debugging your_module.ko | grep -E "(DW_TAG_compile_unit|<file_name>.c)"
能匹配到对应源码文件条目,说明调试符号正常生成。
内容的提问来源于stack exchange,提问作者vka
相关产品推荐
相关产品推荐

