内存泄漏linux查找工具_linux查看内存泄露工具 - CSDN
  • 最近用到STL中的List编程,为了检测写的代码是否会发现内存泄漏,了解了一下相关的知识。所有使用动态内存分配(dynamic memory allocation)的程序都有机会遇上内存泄露(memory leakage)问题,在Linux里有三种常用...

    本文更新记录 作者gatieme, CSDN. GitHub

    2016-08-08 11:37, 添加了Linux内核内存检测工具Kmemleak

    2016-08-08 11:43, 添加了链接内存泄露检测工具比较

    Linux下编写C或者C++程序,有很多工具,但是主要编译器仍然是gcc和g++。最近用到STL中的List编程,为了检测写的代码是否会发现内存泄漏,了解了一下相关的知识。

    所有使用动态内存分配(dynamic memory allocation)的程序都有机会遇上内存泄露(memory leakage)问题,在Linux里有三种常用工具来检测内存泄露的情況,包括:

    参见 http://elinux.org/Memory_Debuggers
    偶然发现的内存泄露检测工具比较

    工具 描述
    valgrind 一个强大开源的程序检测工具
    mtrace GNU扩展, 用来跟踪malloc, mtrace为内存分配函数(malloc, realloc, memalign, free)安装hook函数
    dmalloc 用于检查C/C++内存泄露(leak)的工具,即检查是否存在直到程序运行结束还没有释放的内存,以一个运行库的方式发布
    memwatch 和dmalloc一样,它能检测未释放的内存、同一段内存被释放多次、位址存取错误及不当使用未分配之内存区域
    mpatrol 一个跨平台的 C++ 内存泄漏检测器
    dbgmem
    Electric Fence

    1 被测程序


    为了方便测试,,我们编写了一个简单的程序, 循环10次每次申请了一个100个字节的单元, 但是却不释放

    2 valgrind


    2.1 valgrind介绍


    是不是说没有一种内存检查工具能够在Linux使用呢,也不是,像开源的valgrind工具还是相当不错的

    • Memcheck。这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。这也是本文将重点介绍的部分。

    • Callgrind。它主要用来检查程序中函数调用过程中出现的问题。

    • Cachegrind。它主要用来检查程序中缓存使用出现的问题。

    • Helgrind。它主要用来检查多线程程序中出现的竞争问题。

    • Massif。它主要用来检查程序中堆栈使用中出现的问题。

    • Extension。可以利用core提供的功能,自己编写特定的内存调试工具

    主页 下载
    valgrind downloads

    valgrind介绍

    参照

    Valgrind简单用法

    Unix下C程序内存泄漏检测工具Valgrind安装与使用

    valgrind 的使用简介

    应用 Valgrind 发现 Linux 程序的内存问题

    如何使用Valgrind memcheck工具进行C/C++的内存泄漏检测

    2.2 安装


    源码安装

    下载地址)下载最新版的valgrind,按照里面的README提示,安装后就可以使用这个工具来检测内存泄露和内存越界等

    /configure
    
    make
    
    sudo make install

    当然也可以使用发行版的自带的源中安装

    sudo apt install valgrind

    这是一个没有界面的内存检测工具,安装后,输入 valgrind ls -l 验证一下该工具是否工作正常(这是README里面的方法,实际上是验证一下对ls -l命令的内存检测),如果你看到一堆的信息说明你的工具可以使用了。

    2.3 使用说明


    Valgrind工具包包含多个工具,如Memcheck,Cachegrind,Helgrind, Callgrind,Massif。

    Memcheck

    最常用的工具,用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc()/free()/new/delete的调用都会被捕获。所以,Memcheck 工具主要检查下面的程序错误

    内容 描述
    使用未初始化的内存 Use of uninitialised memory
    使用已经释放了的内存 Reading/writing memory after it has been free’d
    使用超过 malloc分配的内存空间 Reading/writing off the end of malloc’d blocks
    对堆栈的非法访问 Reading/writing inappropriate areas on the stack
    申请的空间是否有释放 Memory leaks – where pointers to malloc’d blocks are lost forever
    malloc/free/new/delete申请和释放内存的匹配 Mismatched use of malloc/new/new [] vs free/delete/delete []
    src和dst的重叠 Overlapping src and dst pointers in memcpy() and related functions

    这些问题往往是C/C++程序员最头疼的问题,Memcheck在这里帮上了大忙。

    Callgrind

    和gprof类似的分析工具,但它对程序的运行观察更是入微,能给我们提供更多的信息。和gprof不同,它不需要在编译源代码时附加特殊选项,但加上调试选项是推荐的。Callgrind收集程序运行时的一些数据,建立函数调用关系图,还可以有选择地进行cache模拟。在运行结束时,它会把分析数据写入一个文件。callgrind_annotate可以把这个文件的内容转化成可读的形式。

    Cachegrind

    Cache分析器,它模拟CPU中的一级缓存I1,Dl和二级缓存,能够精确地指出程序中cache的丢失和命中。如果需要,它还能够为我们提供cache丢失次数,内存引用次数,以及每行代码,每个函数,每个模块,整个程序产生的指令数。这对优化程序有很大的帮助。

    Helgrind

    它主要用来检查多线程程序中出现的竞争问题。Helgrind寻找内存中被多个线程访问,而又没有一贯加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。Helgrind实现了名为“Eraser”的竞争检测算法,并做了进一步改进,减少了报告错误的次数。不过,Helgrind仍然处于实验阶段。

    Massif

    堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。

    此外,lackey和nulgrind也会提供。Lackey是小型工具,很少用到;Nulgrind只是为开发者展示如何创建一个工具

    注意

    Valgrind不检查静态分配数组的使用情况

    Valgrind占用了更多的内存–可达两倍于你程序的正常使用量

    如果你用Valgrind来检测使用大量内存的程序就会遇到问题,它可能会用很长的时间来运行测试

    2.4 使用说明


    编译程序

    g++ -g -o leak leak.c 

    被检测程序加入 –g -fno-inline 编译选项保留调试信息, 否则后面的valgrind不能显示到出错行号。

    valgrind被设计成非侵入式的,它直接工作于可执行文件上,因此在检查前不需要重新编译、连接和修改你的程序。要检查一个程序很简单,只需要执行下面的命令就可以了。

    valgrind --tool=tool_name program_name

    比如我们要对ls -l命令做内存检查,只需要执行下面的命令就可以了

    valgrind --tool=memcheck ls -l

    小提示
    如果不知道有哪些参数, 可以先输入valgrind –tool=, 然后狂按两次tab, 会输出linux系统的只能提示, 同样,如果你输入了valgrind –tool=mem再狂按两次tab,linux系统会为你自动补全

    2.5 使用valgrind检测Memcheck


    下面我们就可以用valgrind对我们的程序检测leak

    valgrind --tool=memcheck --leak-check=full --show-reachable=yes --trace-children=yes    ./leak

    其中–leak-check=full 指的是完全检查内存泄漏,

    –show-reachable=yes是显示内存泄漏的地点,

    –trace-children=yes是跟入子进程。

    当程序正常退出的时候valgrind自然会输出内存泄漏的信息原理:

    输出内存泄漏的信息原

    3 mtrace检测内存泄露


    3.1 mtrace简介


    在一般的linux发行版中,有一个自带的工具可以很方便的替你完成这些事,这个工具就是mtrace.

    mtrace其实是GNU扩展函数,用来跟踪malloc。

    mtrace为内存分配函数(malloc, realloc, memalign, free)安装hook函数。这些hook函数记录内存的申请和释放的trace信息。
    在程序中,这些trace信息可以被用来发现内存泄漏和释放不是申请的内存。
    当调用mtrace,mtrace会检查环境变量MALLOC_TRACE。该环境变量应该包含记录trace信息的文件路径。如果文件可以被成功打开,它的大小被截断为0。
    如果MALLOC_TRACE没有设置,或者设置的文件不可用或者不可写,那么将不会安装hook函数,mtrace不生效。

    详细说明可参考man page:man 3 mtrace

    3.2 mtrace使用


    mtrace能监测程序是否内存泄露

    • 在程序的起始处包含头文件
    #include <mcheck.h>
    • 更改环境变量:export MALLOC_TRACE=”mtrace.out”可以加入如下代码
    setenv("MALLOC_TRACE", "mtrace.out", 1);
    • 调用函数mtrace()
    mtrace()
    • 编译程序带上 -g 选项
    gcc -g -c leak_mtrace.c -o leak_mtrace.o  -std=gnu9x -Wall
    • 运行程序一次,尽量调用所有程序内的函数。这时调试信息就已经被写入我们指定的mtrace.out文件中
    ./leak_mtrace 
    • mtrace a.out mtrace.out查看内存监测情况
    mtrace a.out  mtrace.out

    这里写图片描述

    4 dmalloc


    dmalloc是一种用于检查C/C++内存泄露(leak)的工具,即检查是否存在直到程序运行结束还没有释放的内存,并且能够精确指出在哪个源文件的第几行。

    5 Linux内核的Kmemleak

    5.1 Kmemleak检测工具介绍


    Kmemleak工作于内核态是内核自带的内核泄露检测工具, 其源代码位于mm/kmemleak.c

    Kmemleak工作于内核态,Kmemleak 提供了一种可选的内核泄漏检测,其方法类似于跟踪内存收集器。当独立的对象没有被释放时,其报告记录在 /sys/kernel/debug/kmemleak中,Kmemcheck能够帮助定位大多数内存错误的上下文。

    5.2 Kmemleak使用过程概述

    • 首先`CONFIG_DEBUG_KMEMLEAK在Kernel hacking中被使能.

    • 查看内核打印信息详细过程如下:

      1. 挂载debugfs文件系统
        mount -t debugfs nodev /sys/kernel/debug/
      2. 开启内核自动检测线程
        echo scan > /sys/kernel/debug/kmemleak
      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秒内自动记忆扫描
    scan 开启内核扫描
    clear 清除内存泄露报告
    dump=<addr> 转存信息对象在<addr>

    通过“kmemleak = OFF”,也可以在启动时禁用Kmemleak在内核命令行。在初始化kmemleak之前,内存的分配或释放这些动作被存储在一个前期日志缓冲区。这个缓冲区的大小通过配CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE设置。

    5.3 Kmemleak动态检测原理


    通过的kmalloc、vmalloc、kmem_cache_alloc等内存分配会跟踪其指针,连同其他的分配大小和堆栈跟踪信息,存储在PRIO搜索树。相应的释放函数调用跟踪和指针就会从kmemleak数据结构中移除。
    分配的内存块,被认为是独立的,如果没有指针指向它起始地址或块的内部的任何位置,可以发现扫描内存(包括已保存的寄存器)。这意味着,有可能没有办法为内核通过所分配的地址传递块到一个释放函数,因此,该块被认为是一个内存泄漏。

    扫描算法步骤:
    1. 标记的所有分配对象为白色(稍后将剩余的白色物体考虑独立的)

    1. 扫描存储器与所述数据片段和栈开始,检查对地址的值存储在PRIO搜索树。如果一个白色的对象的指针被发现,该对象将被添加到灰名单

    2. 扫描的灰色对象匹配的地址(一些白色物体可以变成灰色,并添加结束时的灰名单),直到黑色集结束

    3. 剩下的白色物体被认为是独立儿,并报告写入/sys/kernel/debug/kmemleak。
      一些分配的内存块的指针在内核的内部数据结构和它们不能被检测为孤儿。对避免这种情况,kmemleak也可以存储的数量的值,指向一个内的块的地址范围内的地址,需要找到使块不被认为是泄漏.

    5.4 kmem相关函数


    从kernel源代码中的目录include /linux/kmemleak.h中可查看函数原型的头

    函数 功能
    kmemleak_init 初始化kmemleak
    kmemleak_alloc 一个内存块分配的通知
    kmemleak_alloc_percpu 通知的一个percpu的内存块分配
    kmemleak_free 通知的内存块释放
    kmemleak_free_part 通知释放部分内存块
    kmemleak_free_percpu 一个percpu内存块释放的通知
    kmemleak_not_leak 当不是泄露时,标记对象
    kmemleak_ignore 当泄漏时不扫描或报告对象
    kmemleak_scan_area 添加扫描区域内的内存块
    kmemleak_no_scan 不扫描的内存块
    kmemleak_erase 删除一个指针变量的旧值
    kmemleak_alloc_recursive 为kmemleak_alloc,只检查递归
    kmemleak_free_recursive 为kmemleak_free,只检查递归
    展开全文
  • 来自极客时间的讲座中,提到linux查看内存泄露工具:memleak. 1. 使用方式 memleak -a -p $(pidof app) # -a 表示显示每个内存分配请求的大小以及地址 # -p 指定案例应用的 PID 号 2. 遇到问题: Couldn...

    来自极客时间的讲座中,提到linux中查看内存泄露的工具:memleak.

    1. 使用方式

    memleak -a -p $(pidof app)

    #  -a 表示显示每个内存分配请求的大小以及地址

    # -p 指定案例应用的 PID 号

    2. 遇到问题: Couldn’t find .text section in /app,调用栈不能正常输出

       参看原帖地址看解决办法: https://time.geekbang.org/column/140

    3. sourceforge下载源码地址:http://sourceforge.net/projects/memleak/

     

    展开全文
  • linux下开发充满热情,前段时间接手一个linux下程序性能优化的工作,自己在整个过程中零零散散的总结了一些经验,特别把查找和定位内存泄漏方面的经验写下来,尤其是使用的几个开源工具,希望对别人有用,也等于...

    Linux下内存泄漏定位常用工具介绍

    写在前面:

    本人只是一个linux开发新手,对linux下开发充满热情,前段时间接手一个linux下程序性能优化的工作,自己在整个过程中零零散散的总结了一些经验,特别把查找和定位内存泄漏方面的经验写下来,尤其是使用的几个开源工具,希望对别人有用,也等于自己做做笔记,便于以后再次使用或学习。

    整个过程主要有以下几个方面:

    1、阅读源代码及分析动态内存的使用 

    由于之前没有做过类似的问题(纯属小白了,惨遭鄙视....),所以就想着通过自己去看代码,查找里面涉及到使用动态内存的代码段去定位问题(现在想想,真是太幼稚了,大家见笑了...),但是自己还是去通过对源代码跟踪、分析,主要是对动态分配的内存(如malloc函数分配的内存)、一些文件描述符等进行跟踪,分析在程序逻辑中对动态分配的内存有没有手动进行释放,打开的文件描述符有没有关闭等这些代码一点点的去分析,当然这也是熟悉代码,了解的一个过程。

    2、利用memwatch内存检测工具对程序进行内存分析

    Memwatch是一款C语言的内存检测工具。memwatch使用它自己定义的功能函数取代所有在你的程序中用ANSI C定义的内存分配函数,memwatch的内存分配函数包含了所有的分配记录信息。memwatch功能默认不是开启的,除非定义了MEMWATCH,否则在代码中不会跟踪相关的内存使用情况。memwatch通常将它的数据写入到memwatch.log文件中,它也可以被重定向。

    工具使用方法:

    (1)   下载memwatch源码(http://www.linkdata.se/sourcecode.html

    (2)   将memwatch.c和memwatch.h文件拷贝到自己的工程目录中,并在工程中的每个.c文件中添加memwatch.h头文件

    (3)   利用gun工具链编译时带上选项-DMEMWATCH及-DMW_STDIO,并将memwatch.c一并编译。例如工程文件为test.c,需要对其进行内存检测时可以如下进行编译:

    gcc -o -DMEMWATCH -DMW_STDIOtest.c memwatch.c

    (4)   运行编译好的可执行程序,有关内存使用信息日志文件就会保存在memwatch.log中。

    优点:memwatch使用简单方便,工具本身占用内存少。

    缺点:功能简单,不能检测出所有程序中存在的内存问题,可能会有遗漏。在我实践过程中,使用memwatch就不能检测出程序调用开源库函数时发生内存泄漏的问题,memwatch只能做简单的内存检测。

    3、利用valgrind内存检测工具分析内存

        Valgrind是运行在Linux上的一套基于仿真技术的程序调试和分析工具,它包含一个内核,一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等。Valgrind可以检测内存泄漏和内存违例,还可以分析cache的使用等,灵活轻巧而又强大。

        Valgrind一般包含下列工具:

    (1)   memcheck

    最常用的工具,用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc()/free()/new/delete的调用都会被捕获。所以,它能检测以下问题:

    a.对未初始化内存的使用;

    b.读/写释放后的内存块;

    c.读/写超出malloc分配的内存块;

    d.读/写不适当的栈中内存块;

    e.内存泄漏,指向一块内存的指针永远丢失;

    f.不正确的malloc/free或new/delete匹配;

    g,memcpy()相关函数中的dst和src指针重叠。

    这些问题往往是C/C++程序员最头疼的问题,Memcheck在这里帮上了大忙。

    (2)   Callgrind

    和gprof类似的分析工具,但它对程序的运行观察更是入微,能给我们提供更多的信息。

    (3)   Cachegrind

    Cache分析器,它模拟CPU中的一级缓存I1,Dl和二级缓存,能够精确地指出程序中cache的丢失和命中。

    (4)   Helgrind

    它主要用来检查多线程程序中出现的竞争问题。Helgrind寻找内存中被多个线程访问,而又没有一贯加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。

    (5)   Massif

    堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。

        Valgrind工具使用方法:

    (1)   下载Valgrind源码(http://www.valgrind.org/

    (2)   按照工具要求安装Valgrind工具

    (3)   待工具安装完成后,使用valgrind来运行程序即可,举例如下:

    如编译好的工程文件为memleak,则使用valgrind运行memleak如下:

    valgrind [options] ./memleak

                通常使用到的选项有:--tool=memcheck (指定工具)

                                    --leak-check=full(设置检测所有内存问题)

                                    --show-leak-kinds=all(设置提示所有内存泄漏问题)

                                    --track-origins=yes

                                    --log-file=valgrind.log(设置检测的日志信息文本)

                                    --track-fds=yes(设置检测文件描述符)

                                    --time-stamp=yes(设置在日志文件中加入时间戳)

    valgrind结果分析:内存泄露. Memcheck将内存泄露分为两种,一种是可能的内存泄露(Possibly lost),另外一种是确定的内存泄露(Definitely lost)。Possibly lost 是指仍然存在某个指针能够访问某块内存,但该指针指向的已经不是该内存首地址。Definitely lost 是指已经不能够访问这块内存。而Definitely lost又分为两种:直接的(direct)和间接的(indirect)。直接和间接的区别就是,直接是没有任何指针指向该内存,间接是指指向该内存的 指针都位于内存泄露处。

    举例如下:

    valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all--log-file=valgrind.log --time-stamp=yes ./memleak

        优点:功能强力,使用灵活,较memwatch工具全面,可以检测出各种内存问题。

        缺点:使用复杂一些,需要安装,使用时会占用较大的内存。


    以上就先把总结写一下,之后再慢慢将检测的结果做一个事例贴代码出来!感谢大家关注!

    展开全文
  • 1.内存管理是否正确(因为这个程序本身开辟很多内存空间进行缓存管理,同时这个程序程序本身就是基于C/C++开发...针对第一点,以下将介绍几款内存泄漏检查工具 工具 描述 valgrind 一个强大开源的程序检测工...
    • 1.内存管理是否正确(因为这个程序本身开辟很多内存空间进行缓存管理,同时这个程序程序本身就是基于C/C++开发的,内存管理机制一直是程序员头痛的东西)
    • 2.程序的健硕性如何(服务器任何程序的基本要求就是要满足高并发的要求,也就是说,如果达不到这个基本要求,程序并并不能成为服务器)

    针对第一点,以下将介绍几款内存泄漏检查工具

    工具 描述
    valgrind 一个强大开源的程序检测工具
    mtrace GNU扩展,用来跟踪malloc,mtrace为内存分配函数(malloc,rellaoc,memalign,free)安装hook函数
    dmalloc 用于检查C/C++内存泄漏的工具,即是检查是否存在程序运行结束还没有释放的内存,以一个运行库发布
    memwatch 和dmalloc一样,它能检测未释放的内存、同一段内存被释放多次、位址存取错误及不当使用未分配之内存区域
    mpatrol 一个跨平台的 C++ 内存泄漏检测器
    dbgmem 也是一个动态库发布的形式,优点类似dmalloc,但是相比之下,可能特点少了一些
    Electric Fence 不仅仅能够跟踪malloc()和free(),同时能够检查读访问以及写入,能够准确指出导致错误的指令

    Valgrind详解

    这里写图片描述

    Valgrind包括以下一些工具:

    • 1.Memcheck:这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够给发现开发中绝大多数的内存错误使用的情况,比如:使用未初始化
    • 2.callgrind:它主要用来检查程序中函数中调用过程中出现的问题
    • 3.cachegrind:它主要用来检查程序中缓存使用出现的问题
    • 4.Helgrind:它主要用来检查多线程中出现的竞争问题
    • 5.Massif:它主要用来检查程序中堆栈使用中出现的问题
    • 6.Extension:可以使用core提供的 功能,自己编写特定的内存调试 工具

    Linux程序内存空间布局

    这里写图片描述

    • 代码段(.text):这里存放的是CPU要执行的指令,代码是可共享的,相同的代码在内存中只有一份拷贝,同时这个段是只读的,防止程序由于错误而修改自身指令
    • 初始化数据段(.data)。这里存放的是程序中需要明确赋初始值的变量,例如位于所有函数之外的全局变量:int val=100。需要强调的是,以上两段都是位于程序的可执行文件中,内核在调用exec函数启动该程序时从源程序文件中读入。
    • 未初始化数据段(.bss)。位于这一段中的数据,内核在执行该程序前,将其初始化为0或者null。例如出现在任何函数之外的全局变量:int sum;以及未初始化或初值为0的全局变量和静态局部变量
    • 堆(Heap)。这个段用于在程序中进行动态内存申请,例如经常用到的malloc,new系列函数就是从这个段中申请内存。
      已初始化且初值非0的全局变量和静态局部变量
    • 栈(Stack)。函数中的局部变量以及在函数调用过程中产生的临时变量都保存在此段中。可执行代码、字符串字面值、只读变量。

    内存检查原理

    Memcheck检测内存问题的原理图:

    这里写图片描述

    1.Valid-value表:

    对于进程的整个地址空间中的每一字节(byte),都有与之对应的8个bits,对于CPU的每个寄存器,也有一个与之对应的bit向量。这些bits负责记录该字节或者寄存器值是否具有有效 的、已经初始化的值

    2.Valid-Address表

    对于进程整个地址空间中的 么一个字节(byte),还有与 之对应的1bit,负责记录该地址是否能够被读写。

    检测原理

    • 当要读写内存中的某个字节时,首先检查这个字节对应的A bit。如果该A bit显示该位置是无效位置,memcheck则报告读写错误。
    • 内核(core)类似于 一个虚拟的CPU的环境,这样当内存中的某个字节被加载到真实的CPU中时,该字节对应的V bit也被加载到虚拟的CPU环境中,一旦寄存器中的值,被用来产生内存地址,或者该值能够影响程序 的输出,则memcheck会检查对应的vbits,如果该值尚未初始化,则会报告使用未初始化内存错误。

    接下来我主要是介绍valgrind的安装和使用,关于其他的工具,大家可以自己上网去查阅资料,谢谢配合!

    Valgrind 安装

    • 1.解压安装包
    tar -jxvf valgrind-3.11.0.tar.bz2  -C /usr/local/src
    • 1
    • 2.进入目录安装
    cd /usr/local/src/valgrind-3.11.0
    • 1
    • 3.运行./autogen.sh 设置环境(需要标准的autoconf工具)
    ./autogen.sh 
    • 1
    • 4.配置Valgrind,生成MakeFile文件
    ./configure --prefix=/usr/local
    • 1
    • 5.编译和安装valgrind
    make  && make install
    • 1

    valgrind 使用

    • 第一步:准备好程序

      为了valgrind发现的错误更精确,如能够定位到源代码的行,建议在编译时加上-g参数,编译优化选项选择O0(不要优化)

    • 第二步:在valgrind下,运行可执行程序

      利用valgrind调试内存问题,不需要重新编译源程序,它的输入就是二进制的可执行程序。调用Valgrind的通用格式是:valgrind [valgrind-options] your-prog [your-prog-options]
      Valgrind 的参数分为两类,一类是 core 的参数,它对所有的工具都适用;另外一类就是具体某个工具如 memcheck 的参数。Valgrind 默认的工具就是 memcheck,也可以通过“–tool=tool name”指定其他的工具。Valgrind 提供了大量的参数满足你特定的调试需求,具体可参考其用户手册。

    这里写图片描述
    这里写图片描述

    利用Memcheck发现常见的内存问题总结

    Memcheck将内存泄露分为两种,一种是可能的内存泄露(Possibly lost),另外一种是确定的内存泄露(Definitely lost)。Possibly lost 是指仍然存在某个指针能够访问某块内存,但该指针指向的已经不是该内存首地址。Definitely lost 是指已经不能够访问这块内存。而Definitely lost又分为两种:直接的(direct)和间接的(indirect)。直接和间接的区别就是,直接是没有任何指针指向该内存,间接是指指向该内存的指针都位于内存泄露处。在上述的例子中,根节点是directly lost,而其他节点是indirectly lost

    展开全文
  • 很好解决代码中存在的内存泄露的问题,值得拥有!
  • 在c++中,所有由new和malloc分配的堆内存都要由配对的delete和...在linux的调试工具中,valgrind工具可以用来检查程序中内存泄露。 下载安装指令如下: sudo apt-get install valgrind 使用格式如下: valgri...
  • 最近用到STL中的List编程,为了检测写的代码是否会发现内存泄漏,了解了一下相关的知识。 所有使用动态内存分配(dynamic memory allocation)的程序都有机会遇上内存泄露(memory leakage)问题,在Linux里有三种常用...
  • Linux内存泄漏分析

    2018-11-13 23:22:58
    ...   在实际的项目中,最难缠的问题就是内存泄漏,当然还有panic之类的,内存泄漏分为两部分用户空间... 用户空间查看内存泄漏和解决都相对简单。定位问题的方法和工具也很多相对容易.我们来看看. 1. 查看内存信...
  • Linux查看内存泄露

    2018-09-28 10:02:22
    Linux下 valgrind 检测内存泄露 编译时使用调试模式 -g 使用 valgrind 的 memcheck 工具来检测 valgrind --tool=memcheck --leak-check=full --log-file=./log.txt ./a.out 测试代码 #include &amp;lt;...
  • Linux内存泄漏与溢出

    2018-05-06 11:16:49
    Linux系统下真正有危害的是内存泄漏的堆积,这会最终消耗尽系统任何的内存。下面是排查和解决方案与大家一起分享。1、Linux 内存监控内存泄漏的定义:一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程式从堆中...
  •  内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,在大型的、复杂的应用程序中,内存泄漏是常见的问题。当以前分配的一片内存不再需要使用或无法访问时,但是却并没有释放它,...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • 所有使用动态内存分配(dynamic memory allocation)的程序都有机会遇上内存泄露(memory leakage)问题,在Linux里有三种常用工具来检测内存泄露的情況,包括: mtrace dmalloc memwatch 1. mtrace from:...
  • Linux中定位内存泄漏

    2017-05-23 21:22:16
    1. 什么是内存泄漏内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的、大小任意的(内存块的大小可以在程序运行期决定)、使用完后必须显示释放的内存。应用程序一般使用malloc、realloc、new等函数从堆中分配...
  • 1.什么是内存泄露内存泄露指的是应用程序在分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。 2.造成内存泄露的原因是什么? 一般情况下造成内存泄露的主要原因是,由于程序...
  • 在遇到内存泄露类问题时,经常会对此束手无策,本文通过对proc下进程相关的文件进行分析,精确评估系统消耗内存的大小,还可以对内存泄露类问题的解决提供一种定位手段。  Linux内存使用上的原则是:如果内存充足...
  • Linux检测程序内存泄漏1.安装valgrind: 这是一款开源的程序内存检测工具,mtrace为内存分配函数(malloc, realloc, memalign,free)安装hook函数。这些hook函数记录内存的申请和释放的trace信息。Valgrind详解:...
1 2 3 4 5 ... 20
收藏数 24,401
精华内容 9,760
关键字:

内存泄漏linux查找工具