Linux Kernel模块内存泄露分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux Kernel模块内存泄露分析相关的知识,希望对你有一定的参考价值。

参考技术A

假如通过“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进程内存泄露分析

1、valgrind
Valgrind 不对静态数组 (分配在栈上) 进行边界检查。valgrind --tool=memcheck ./test

valgrind的memcheck工具。但是这个性能极低,不具备可用性。

2、heaptrack
构建heaptrack的想法源于对valgrind的massif工作的痛苦。 agavi在内存和时间上有巨大的开销,有时会阻止你在更大的实际应用程序上运行它。

对于简单堆分析器来说,Valgrind所做的大部分不需要。

heaptrack-- 一个用于Linux的堆内存分析器

这个工具也是从valgrind的massif的思路得到启发并做重设计和重实现的产物,

1)代码级别的跟踪

2)栈回溯

3)内存profile

4)无嵌入性

5)高性能

不是调试版程序,也可以运行时插入

heaptrack program param

或者 heaptrack --pid 进程pid

启动后,会有输出信息告诉你生成的追踪文件在哪生成

编译的程序要-lpthread才可以注入监控,heaptrack工具。只能排查,你注入监控。 到停止监控。这过程中的。内存泄露。

heaptrack_print 工具是一个具有最小依赖性的命令行 应用程序。 它接受堆概要文件,分析它,并将结果以ASCII格式打印到 命令行。

在最简单的形式中,你可以像这样使用它:

heaptrack_print heaptrack.APP.PID.gz | less

3、调用分析
gcc -pg xx.c         gmon.out

OProfile: Linux 平台上的一个功能强大的性能分析工具,使用参考https://www.ibm.com/developerworks/cn/linux/l-oprof/
 

以上是关于Linux Kernel模块内存泄露分析的主要内容,如果未能解决你的问题,请参考以下文章

java内存泄露分析定位

怎样发现内存泄露?

如何查看和调试动态链接库的内存泄露

Linux进程内存泄露分析

Linux进程内存泄露分析

linux下内存泄露检测工具Valgrind