linux 内存泄露?内存泄漏工具
大家好,今天给各位分享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系统中查找内存泄露的方法Linux查内存泄露
Linux系统中查找内存泄露的方法
Linux是一款开源的类UNIX操作系统。它可以运行在多种硬件平台上,拥有高效率、稳定性和安全性,是一款优秀的操作系统。尽管Linux系统几乎不受攻击,但在某些偶然情况下,Linux中也存在内存泄露。
内存泄露指的是,由于源代码的某些原因,该程序在启动或终止时无法释放内存,从而导致系统性能欠佳以及应用程序崩溃或报错。
在Linux系统中,查找内存泄露可以采用以下几种方法:
1、查看设备:使用top命令或free命令,查看内存使用情况。如果发现内存使用量经常在增长,而应用程序的系统资源却没有任何变化,则存在可能的内存泄露情况。
2、查看日志文件:可以在/var/log/messages文件中查看操作系统的日志信息,若出现“Out of memory”的报错,则可能存在内存泄漏的问题。
3、查看堆栈跟踪:运行strace命令对上述进程进行堆栈跟踪,可以查看到进程调用了哪些系统资源服务,以及是否有内存泄露。
4、检查内存使用情况:使用/proc//status文件查看每个进程的内存使用情况,若发现内存使用量一直在增长,则可能有内存泄露。
5、使用Valgrind工具:Valgrind是一款非常有用的内存泄漏检测工具,可以检测程序是否有内存泄露等问题。
总之,Linux系统中查找内存泄露的方法有诸多,用户可以根据自身的实际需求选择不同的方法以检测是否存在内存泄漏的问题。
嵌入式linux怎么检内存泄漏雨
1.在需要内存泄漏检查的代码的开始调用void mtrace(void)(在mcheck.h中?有声明). mtrace为malloc等函数安装hook,用于记录内存分配信息.在需要内存泄漏检查的代码的结束调用void muntrace(void).
注意:一般情况下不要调用muntrace,而让程序自然结束.因为可能有些释放内存代码要到muntrace之后才运行.
2.用debug模式编译被检查代码(-g或-ggdb)
3.设置环境变量MALLOC_TRACE为一文件名,这一文件将存有内存分配信息.
4.运行被检查程序,直至结束或muntrace被调用.
5.用mtrace命令解析内存分配Log文件($MALLOC_TRACE)
(mtrace foo$MALLOC_TRACE, where foo is the executible name)
如果有内存泄漏, mtrace会输出分配泄漏
内存的代码位置,以及分配数量.
附加说明
1.可以将mtrace, muntrace放入信号处理函数(USR1, USR2),以动态地进行内存泄漏检查控制.
2. mtrace是个perl代码,如果你对符号地址与代码文本的转换感兴趣,可以读一下.
3. again,尽量不要用muntrace()
For C++ Leak:
检查内存泄漏的方法除glibc提供外;还可以试试一些专用的程序。
很奇怪,redhat 9居然不带mtrace perl脚本,只好下载gcc源码编译了
wget--passive-ftp
rpm-ivh glibc*.src.rpm
cd/usr/src/redhat/SPECS/
rpmbuild-ba glibc-9.spec
cd/var/tmp/glibc-2.3.2-root/usr/bin/
cp mtrace/usr/bin/
调试方法如下:
vi a.c
1#include
2
3 int main()
4{
5 mtrace();
6 malloc(10);
7 malloc(16);
8 return 0;
9}
$gcc-g a.c#记得编译带-g调试选项
$export MALLOC_TRACE=a.log
$./a.out
$unset MALLOC_TRACE#记得执行完后unset变量,否则可能运行其他命令可能覆盖log
$mtrace a.out a.log
Memory not freed:
-----------------
Address Size Caller
0x09b08378 0xa at/XXX/a.c:6
0x09b08388 0x10 at/XXX/a.c:7
可以看到,会显示未释放动态空间的代码具体位置。