HACK#63 检测内核的内存泄漏

本节介绍检测内核内存是否有泄漏的工具kmemleak(Kernel memory leak detector)。

kmemleak是检测内核空间的内存泄漏的调试功能。监测对象是通过内核的函数kmalloc()、vmalloc()、kmem_cache_alloc()分配的内存区域。从Linux 2.6.31开始安装了这个功能。启用kmemleak,对内核、驱动程序、模块进行测试,就可以很方便地得出内存泄漏的可能性。

编译内核

要使用kmemleak,需要启用内核配置CONFIG_DEBUG_KMEMLEAK,重新构建内核。如果使用make menuconfig,则配置项目如下。


Kernel hacking—->

[*]Kernel memory leak detector

(400)Maximum kmemleak early log entries


关于Maximum kmemleak early log entries

make menuconfig中除了Kernel memory leak detector以外还有Maximum kmemleak early log entries。kmemleak准备了仅在内核启动时使用的锁的缓冲区。这个项目就是用来设置这个缓冲区大小的最大值。

一旦内核启动就会进行kmemleak的初始化。初始化完成后,就可以随时输出日志,并定期对内存进行检查。从kmemleak的结构也可以检测出初始化结束之前的内存泄漏,但是不能输出日志。这时就将初始化结束之前的内存泄漏信息暂时存放在这个缓冲区。启动时如果检测出大量的内存泄漏,输出了Early log buffer exceeded, please increase DEBUG_KMEMLEAK_EARLY_LOG_SIZE的信息,就需要增大Maximum kmemleak early log entries的值。单位是为输出日志而记录的内存个数。可以设置为200~40000。默认为400。