如何检测谁发出了错误的kfree

时间:2012-09-05 07:59:29

标签: memory-management memory-leaks linux-kernel double-free

我怀疑我的内核代码中有一个双kfree。基本上,我在模块中有一个kzalloced和kfreed的数据结构。我注意到分配了相同的地址,然后再次分配,而不是在模块中释放。

我想知道我应该采用什么技术来找到发出错误的kfree的地方。

2 个答案:

答案 0 :(得分:4)

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的简单示例,请参阅“检测内存泄漏”部分。

答案 1 :(得分:2)

您是否尝试过启用kmemleak检测代码?

有关详细信息,请参阅Documentation/kmemleak.txt