Kmemleak 提供了一种可选的内核泄漏检测,其方法类似于跟踪内存收集器
使用Kmemleak需要在内核中将CONFIG_DEBUG_KMEMLEAK使能(默认未使能,因此使用该功能会涉及替换内核)。
1. 将内核默认.config文件拷贝到源码目录下。
cd linux-3.10.0-327.el7
cp /boot/config-3.10.0-327.el7.x86_64 .config .
2. make menuconfig
执行make menuconfig,然后配置项如下:
Kernel hacking -à
[*] Kernel memory leak detector
(4000) Maximum kmemleak early log entries
如图:
然后save,并退出。
3. 执行如下命令编译内核
make –j24
makemodules_install
make install
4. 设置内核启动选项
(1)grub2-editenv list //查看当前内核
(2) cat /boot/grub2/gurb.conf | grep menuentry 查看所有内核
(3)grub2-set-default'CentOS Linux (3.10.0) 7 (Core)' 设置新编译内核为默认启动。
5. reboot 使新内核生效
重启之后,执行dmesg |grep memleak能查看如如下信息,说明设置成功。
6. kmemleak的使用
(1)挂载debugfs文件系统
mount -t debugfs nodev /sys/kernel/debug/
(2)开启内核自动检测线程
echo scan > /sys/kernel/debug/kmemleak
通过dmesg |grep memleak可以看到检测的情况。
(3)查看打印信息
cat /sys/kernel/debug/kmemleak
(4)清除内核检测报告,新的内存泄露报告将重新写入/sys/kernel/debug/kmemleak
echo clear > /sys/kernel/debug/kmemleak
内存扫描参数可以进行修改通过向/sys/kernel/debug/kmemleak 文件写入。 参数使用如下:
off禁用kmemleak(不可逆)
stack=on启用任务堆栈扫描(default)
stack=off禁用任务堆栈扫描
scan=on启动自动记忆扫描线程(default)
scan=off停止自动记忆扫描线程
scan=<secs>设置n秒内自动记忆扫描,默认600s
scan开启内核扫描
clear清除内存泄露报告
dump=<addr>转存信息对象在<addr>