我怀疑我的内核代码中有双重 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 tool

与 kmemleak 不同,大多数情况下,不需要重建内核即可使用 KEDR。

关于如何构建和使用 KEDR 的说明是 here 。 “检测内存泄漏”部分描述了如何使用 LeakCheck 的一个简单示例。

关于memory-management - 如何检测谁发布了错误的 kfree,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12276969/

10-12 15:59