如何为crash工具配置自定义内核模块对应的调试源码?
解决crash工具无法关联自定义内核模块源码的问题
1. 确保自定义模块编译时保留完整调试信息
- 内核编译层面开启
CONFIG_DEBUG_INFO,保证系统内核本身包含调试符号。 - 模块编译时,在Makefile中添加调试编译选项,禁用优化以保留源码行号:
EXTRA_CFLAGS += -g -O0 - 编译时不要使用
-fdebug-prefix-map修改源码路径,确保.ko文件中嵌入的是自定义源码的绝对路径,避免crash找不到对应文件。
2. 匹配模块与vmcore的编译环境
- 自定义模块的编译环境(内核版本、gcc版本、编译参数)必须和生成vmcore的目标系统完全一致,否则符号表、代码段偏移会不匹配,crash无法正确关联。
- 对比目标系统中加载的
ufs.ko与本地自定义模块的MD5值,确认是同一文件:md5sum /lib/modules/$(uname -r)/kernel/drivers/ufs/ufs.ko /path/to/custom/ufs.ko
3. 正确加载自定义模块并指定源码路径
- 启动crash工具加载vmcore和系统内核镜像后,执行以下命令加载自定义模块:
crash> mod -s ufs /path/to/custom/ufs.ko - 执行
mod命令查看模块列表,确认ufs模块的路径已替换为自定义文件。 - 在crash交互界面中,手动指定自定义模块的源码路径:
crash> set srcdir /path/to/your/custom/ufs/source - 用
show srcdir命令确认路径已生效。
4. 验证关联效果
- 查找自定义函数的符号信息,确认能定位到源码:
crash> sym ufs_your_custom_function - 执行带源码行号的反汇编,检查是否能显示自定义代码的行号:
crash> dis -l ufs_your_custom_function - 如果仍无法关联,检查:
- crash工具版本是否过旧,升级到最新稳定版;
- 编译时是否误开了优化选项,重新用
-O0编译模块; - 自定义模块是否被系统加载的旧模块覆盖,确认目标系统运行的是你的自定义模块。
内容的提问来源于stack exchange,提问作者hustler_singh
相关产品推荐
相关产品推荐

