开发内核模块时,个人认为kdump+crash是必备的工具,kdump用于在内核崩溃时生成转储文件(core文件),crash用来分析core文件,查看崩溃时的栈信息、调用信息、出错的执行路径等。
如果出错的位置是在内核函数中(当然大部分是由于模块不正确地调用内核函数),则很容易看到内核的代码位置。假设出错的函数是blk_requeue_request,出错的位置在blk_requeue_request函数中的偏移为82,在crash中输入“gdb L*blk_requeue_request+82”即可查看出错位置对应的源代码,如下图所示:
当然也可以通过“dis -l
blk_requeue_request+82
”或者“dis -l 地址”(地址为RIP的值)也可以看到,但是没有上面的命令直观,总之是很容易看到的,然后再根据业务逻辑很容易就能找到错误。