linux内存泄露检测工具
‘壹’ linux Kernel模块内存泄露分析
假如通过“Free”查看内存几乎耗尽,但通过 top/ps 命令却看不出来用户态应用凳凯程序占用太多的内存空间, 那么内核模块可能发生了内存泄露
SLAB 是Linux内核中按照对象大小进行分配的内存分配器。
通过SLAB的信息好让来查看内核模块占用的内存空间:
方法1. 查看meminfo文件
方法2. 查看slabinfo文件
一般查看slabinfo文件就足以,如果发现slabinfo中占用内存过大,那基本可以断定,内核模块出现了内存泄露了
还有个命令 slabinfo 也是可以看,其实也是去读 /proc/slabinfo 后可视化出来
Linux内核的Kmemleak实现内存泄露检测
看看下面这个函数是哪里导致的内存泄漏呢?
一眼可能不容易看出上面的有什么问题,有kmalloc,有kfree 成对出现的。
问题正好出在 pr_debug 这个函数中的参数传递, 熟悉函数调用传参的人应该会知道编译器一般对参数的处理采用堆栈的方式,是一个先进后出的过程,这样参数的执行一般是逆序的(由于编译器实现的不同,这个过程不枣袜唤是确定的),这样kfree会在kmalloc之前运行,导致每次运行都会泄漏一点内存。
Resolving Memory Leaks In Linux Kernel
Slab Allocator
Proc Info
Using Crash Debugger
‘贰’ linux内存泄漏怎么查
可以使用对应的软件测试工具来查,如parasoft的c/c++等
‘叁’ Linux系统中怎么使用valgrind检查内存
valgrind主要用于检测程序内存使用异常,例如使用未初始化内存,重复释放内存,堆栈非法访问,申请空间未释放等。
使用示例(检测内存泄露): valgrind --leak-check=full --show-reachable=yes --show-leak-kinds=all 程序名
更多使用方法可以参见help信息