背景
循环压力测试驱动某个模块功能时,会出现alloc不到memory情况
工具
利用Linux自带的工具(kmemleak),进行调试
怎样编译出工具
配置config,默认配置如下:
CONFIG_DEBUG_KMEMLEAK=y
CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=4000
CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y
修改后:
CONFIG_DEBUG_KMEMLEAK=y
CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=10000
CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=n
- 1.CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF配置为n,表示默认编译kmemleak模块
void __init kmemleak_init(void)
{
int i;
unsigned long flags;
#ifdef CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF //关掉此宏
if (!kmemleak_skip_disable) {
kmemleak_early_log = 0;
kmemleak_disable();//这个会关掉kmemleak功能
return;
}
#endif
- 2.如果CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE不修改的话,在初始化的时候会默认disable
static void __init log_early(int op_type, const void *ptr, size_t size,
int min_count)
{
unsigned long flags;
struct early_log *log;
if (kmemleak_error) {
/* kmemleak stopped recording, just count the requests */
crt_early_log++;
return;
}
//这里会判断log size是不是大于4000,如果不是,则disable
if (crt_early_log >= ARRAY_SIZE(early_log)) {
crt_early_log++;
kmemleak_disable();
return;
}
...
}
- 3.上面代码在kernel/msm-4.9/mm/kmemleak.c文件中
配置好并且编译kernel后,开始调试
- 查看目录/sys/kernel/debug下有没有kmemleak文件?有则配置成功,没有请重新配置
- 抓取kernel log, cat /dev/kmsg | grep kmemleak
- 开启扫描echo scan=on > /sys/kernel/debug/kmemleak
- 等待一会后看看log中是否会有kmemleak,再同步cat /sys/kernel/debug/kmemleak
- 我这边有故意alloc memory后没有释放,cat log如下:
unreferenced object 0xffffffdf0aebd900 (size 4096):
comm "cat", pid 10908, jiffies 4295008846 (age 822.560s)
hex dump (first 32 bytes):
1c d9 eb 0a df ff ff ff 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 01 00 00 00 2f 73 64 63 ............/sdc
backtrace:
[<ffffff95e8637b64>] kmem_cache_alloc+0x1dc/0x2d8
[<ffffff95e865b844>] getname_kernel+0x3c/0x104
[<ffffff95e8e07900>] himax_vendor_read+0x64/0x300
[<ffffff95e86c46bc>] proc_reg_read+0x88/0xf4
[<ffffff95e8649cbc>] vfs_read+0x98/0x178
[<ffffff95e864b360>] SyS_read+0x60/0xc0
[<ffffff95e8483770>] el0_svc_naked+0x24/0x28
[<ffffffffffffffff>] 0xffffffffffffffff
- 每调用proc_reg_read后就会出现4K的内存泄漏,如果调用n次可想而知.
以此记录