在内核调试过程中经常遇到一些内存泄漏的问题,这里主要介绍kmemleak的一些使用方法,便于日常问题分析。
kmemleak可以追踪kmalloc(), vmalloc(), kmem_cache_alloc()等函数引起的内存泄漏,一般用于slab内存泄漏,可以参考内核linux//Documentation/dev-tools/kmemleak.rst中的介绍。
内核打开kmemleak的相关宏如下:
CONFIG_DEBUG_KMEMLEAK=y
CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=n
CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=40000(说明如下)
config DEBUG_KMEMLEAK_EARLY_LOG_SIZE
int "Maximum kmemleak early log entries"
depends on DEBUG_KMEMLEAK
range 200 40000
default 16000
help
Kmemleak must track all the memory allocations to avoid
reporting false positives. Since memory may be allocated or
freed before kmemleak is initialised, an early log buffer is
used to store these actions. If kmemleak reports "early log
buffer exceeded", please increase this value.
开启如上内核宏之后,重新编译内核烧录,系统起来可以看到如下节点生成:
ls cat /sys/kernel/debug/kmemleak
kmemleak使用方法:
echo scan > sys/kernel/debug/kmemleak // 开始扫描
cat sys/kernel/debug/kmemleak
echo clear > sys/kernel/debug/kmemleak // 清除log
重复的backtrace会越来越多,不断增长,一般这里就是内存泄露的点。clear一般是用在第一次有误抓的情况清楚log。
可以自己写一个kmallc分配128字节的实例,并不释放内存,然后抓取kmemleak log。