当前位置:首页 > 内存 > 正文

linux内存泄漏如何定位(linux内存剩余怎么看)

  • 内存
  • 2024-06-07 09:19:01
  • 2146

一、如何在linux下检测内存泄漏检测内存泄漏的方法主要有五种:1.在代码开头,调用voidmtrace(void),它检查内存泄漏(该函数在头文件mcheck.h中定义)。mtrace为malloc等函数安装钩子来记录内存分配信息。注意:一般情况下不要调用muntrace,让程序自然完成,因为一些内存释放代码在muntrace之后可能无法运行2.使用调试模式(-g或-ggdb)编译要检查的代码。3.将环境变量MALLOC_TRACE设置为文件名。4.运行直到突出显示的程序结束或调用Muntres。5.使用mtrace命令分析内存分配日志文件($MALLOC_TRACE)(mtracefoo$MALLOC_TRACE,其中foo是可执行文件名称)。


二、LinuxKernel模块内存泄露分析

如果你已经用“free”确认了内存几乎耗尽,但是用top/ps命令看不到用户态应用程序占用了太多内存,那么内核模块可能存在内存泄漏

SLAB是Linux内核中的一个内存分配器,根据对象的大小进行分配。

利用SLAB信息显示内核模块占用的内存空间:

方法一。查看meminfo文件

第二种方法。查看slabinfo文件

一般来说,查看slabinfo文件就足够了。如果发现slabinfo占用的内存很大,可以断定是内核模块存在内存泄漏。
还有一个slabinfo命令其实也可以查看,因为它读取的是/proc。/slabinfo可见

Linux内核的Kmemleak检测到内存泄漏

让我们看看哪里。以下函数会导致内存泄漏吗?

上面的内容可能不太容易一眼看出哪里出了问题。其中kmalloc和kfree是成对出现的。

问题是参数是在pr_debug函数中传递的。熟悉函数调用中传递参数的人应该知道,编译器一般采用栈的方式来处理参数,这是最先进入的,而参数通常是按照相反的顺序执行的(由于函数的实现不同)编译器,这个过程是不确定的),所以kfree会先于kmalloc运行,导致每次运行时都会出现轻微的内存泄漏。

解决Linux内核中的内存泄漏问题

SlabAllocator

ProcInfo

使用CrashDebugger