我怀疑我的内核代码中有双重 kfree。基本上,我有一个在模块中被 kzalloced 和 kfreed 的数据结构。我注意到分配了相同的地址,然后再次分配,而没有在模块中释放。
我想知道我应该采用什么技术来查找错误的 kfree 发布位置。
我怀疑我的内核代码中有双重 kfree。基本上,我有一个在模块中被 kzalloced 和 kfreed 的数据结构。我注意到分配了相同的地址,然后再次分配,而没有在模块中释放。
我想知道我应该采用什么技术来查找错误的 kfree 发布位置。
1. 是的,kmemleak是一个优秀的工具,特别适合系统范围的分析。
请注意,如果您打算使用它来分析内核模块,您可能需要在加载模块时保存包含模块代码(.text、.init.text、...)的 ELF 部分的地址. 这可以帮助您破译 kmemleak 报告中的调用堆栈。在模块卸载后要求 kmemleak 生成报告通常是有意义的,但此时 kmemleak 无法解析地址。
当一个模块被加载时,它的部分的地址可以在/sys/module/<module_name>/sections/
.
在您找到报告中每个代码地址所属的部分以及该部分的相应偏移量后,您可以使用 objdump、gdb、addr2line 或类似工具来获取有关感兴趣事件发生位置的更详细信息。
2、除此之外,如果你在x86系统上工作,你想分析单个内核模块,你也可以使用KEDR LeakCheck工具。
与 kmemleak 不同,大多数情况下,不需要重新构建内核即可使用 KEDR。
有关如何构建和使用 KEDR 的说明在此处。“检测内存泄漏”部分描述了如何使用 LeakCheck 的简单示例。
您是否尝试过启用 kmemleak 检测代码?
详情请参阅Documentation/kmemleak.txt
。