kgdb的详细用法就不多说了,只说说怎么调试内核模块,因为内核模块的符号地址信息并没有包含在vmlinux里,所以需要载入模块的信息:
gdb加载内核模块的命令为:
1 | add-symbol-file FILE ADDR |
找到ADDR最直接的方法就是:在插入模块之前,在kernel/module.c中设置一个断点,因为函数module_alloc_update_bounds返回的是模块的地址:
1 | 2097 ptr = module_alloc_update_bounds(mod->core_size); |
所以:
1 | gdb > b kernel/module.c:2097 |
这样你就可以看到模块的地址了,后面就好办了,你可以在模块里的任意函数设断点了。