linux下有什么检测linux 查看内存溢出出的工具

目前在linux开发一个分析实时路况的应用程序,在联合测试中发现程序存在内存泄露的情况。
这下着急了,马上就要上线了,还好发现了一款Valgrind工具,完美的解决了内存泄露的问题。
推荐大家可以使用看看。
Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它的主要作者是获得过Google-O'Reilly开源大奖的Julian Seward,它包含一个内核──一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等。Valgrind可以检测内存泄漏和内存违例,还可以分析cache的使用等,灵活轻巧而又强大,能直穿程序错误的心脏,真可谓是程序员的瑞士军刀。&
(一). Valgrind概观&Valgrind一般包含下列工具:&1.Memcheck (后续我们只对这款内存检测工具做介绍)最常用的工具,用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc()/free()/new/delete的调用都会被捕获。所以,它能检测以下问题:&1.对未初始化内存的使用;&2.读/写释放后的内存块;&3.读/写超出malloc分配的内存块;&4.读/写不适当的栈中内存块;&5.内存泄漏,指向一块内存的指针永远丢失;&6.不正确的malloc/free或new/delete匹配;&7,memcpy()相关函数中的dst和src指针重叠。&这些问题往往是C/C++程序员最头疼的问题,Memcheck在这里帮上了大忙。&2.Callgrind&和gprof类似的分析工具,但它对程序的运行观察更是入微,能给我们提供更多的信息。和gprof不同,它不需要在编译源代码时附加特殊选项,但加上调试选项是推荐的。Callgrind收集程序运行时的一些数据,建立函数调用关系图,还可以有选择地进行cache模拟。在运行结束时,它会把分析数据写入一个文件。callgrind_annotate可以把这个文件的内容转化成可读的形式。&3.Cachegrind&Cache分析器,它模拟CPU中的一级缓存I1,Dl和二级缓存,能够精确地指出程序中cache的丢失和命中。如果需要,它还能够为我们提供cache丢失次数,内存引用次数,以及每行代码,每个函数,每个模块,整个程序产生的指令数。这对优化程序有很大的帮助。&4.Helgrind&它主要用来检查多线程程序中出现的竞争问题。Helgrind寻找内存中被多个线程访问,而又没有一贯加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。Helgrind实现了名为&Eraser&的竞争检测算法,并做了进一步改进,减少了报告错误的次数。不过,Helgrind仍然处于实验阶段。&5. Massif&堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。&此外,lackey和nulgrind也会提供。Lackey是小型工具,很少用到;Nulgrind只是为开发者展示如何创建一个工具。我们就不做介绍了。&
(二). Valgrind下载与安装
valgrind官网:http://valgrind.org下载
如果安装有svn则可以直接下载最新版本:svn co svn://svn.valgrind.org/valgrind/trunk valgrind
cd valgrind
&./autogen.sh
./configure --prefix=...
make install
(二). 使用Memcheck 工具进行内存分析
1、编译你的程序debug版本./TestMem
2、执行:valgrind --tool=memcheck --leak-check=full --log-file=./log.txt &./TestMem
3、耐心等待并分析结果(log.txt结果文件中会包含引起内存泄露的代码在在源码中的位置,即以下举例说明中标明为红色的部分)
举例说明:
下面是一段有问题的C程序代码test.c
#include &stdlib.h&void f(void){int* x = malloc(10 * sizeof(int));x[10] = 0; //问题1: 数组下标越界} //问题2: 内存没有释放int main(void){f();return 0;}1、 编译程序test.cgcc -Wall test.c -g -o test2、 使用Valgrind检查程序BUGvalgrind --tool=memcheck --leak-check=full ./test3、 分析输出的调试信息==3908== Memcheck, a memory error detector.==3908== Copyright (C) , and GNU GPL'd, by Julian Seward et al.==3908== Using LibVEX rev 1732, a library for dynamic binary translation.==3908== Copyright (C) , and GNU GPL'd, by OpenWorks LLP.==3908== Using valgrind-3.2.3, a dynamic binary instrumentation framework.==3908== Copyright (C) , and GNU GPL'd, by Julian Seward et al.==3908== For more details, rerun with: -v==3908==&--3908-- DWARF2 CFI reader: unhandled CFI instruction 0:50--3908-- DWARF2 CFI reader: unhandled CFI instruction 0:50/*数组越界错误*/==3908== Invalid write of size 4&==3908== at 0x8048384: f (test.c:6)==3908== by 0x80483AC: main (test.c:11)==3908== Address 0x400C050 is 0 bytes after a block of size 40 alloc'd==3908== at 0x40046F2: malloc (vg_replace_malloc.c:149)==3908== by 0x8048377: f (test.c:5)==3908== by 0x80483AC: main (test.c:11)==3908==&==3908== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 14 from 1)==3908== malloc/free: in use at exit: 40 bytes in 1 blocks.&==3908== malloc/free: 1 allocs, 0 frees, 40 bytes allocated.==3908== For counts of detected errors, rerun with: -v==3908== searching for pointers to 1 not-freed blocks.==3908== checked 59,124 bytes.==3908==&==3908==&/*有内存空间没有释放*/==3908== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1==3908== at 0x40046F2: malloc (vg_replace_malloc.c:149)==3908== by 0x8048377: f (test.c:5)==3908== by 0x80483AC: main (test.c:11)==3908==&==3908== LEAK SUMMARY:==3908== definitely lost: 40 bytes in 1 blocks.==3908== possibly lost: 0 bytes in 0 blocks.==3908== still reachable: 0 bytes in 0 blocks.==3908== suppressed: 0 bytes in 0 blocks.
阅读(...) 评论()欢迎您光临亿恩科技官网!
域名常见问题
虚拟主机使用指南
云主机使用指南
服务器租用/托管指南
服务器租用/托管指南
智能建站使用指南
> >文章内容
linux下检测内存泄漏工具Valgrind
发布时间:&& 11:03:36
linux下检测内存泄漏工具Valgrind简介
在我们编写C/C++的时候,最常见的错误之一就是内存泄露,这样的问题其实跟程序员的编程习惯密不可分。如果你在申请内存空间之后能够马上在合适的位置释放内存。会极大程度的避免内存泄漏的情况。但是人非圣贤,孰能无过。有时候我们确实忘记释放内存而导致了比较严重的错误,所以这个时候我们需要借助valgrind这个工具来判断内存泄漏。
Valgrind 是一款 Linux下(支持 x86、x86_64和ppc32)程序的内存调试工具,它可以对编译后的二进制程序进行内存使用监测(C语言中的malloc和free,以及C++中的new和delete),找出内存泄漏问题。
Valgrind 中包含的 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 C 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)
valgrind的使用实例:
在官网上找到valgrind的tar包,解压,编译。完成后make安装:
编译到制定位置:
安装valgrind:
完成之后我们就可以对系统中的程序进行检测了,首先我们用ls显示根目录下的文件,ls命令是没有内存泄漏的:
为了体现valgrind 的检错功能,我们故意编写一个只malloc没有free的C程序:&
编译链接后使用valgrind进行检测,发现有内存泄漏:
然后我们在C程序中释放内存:
再次编译链接完成后使用valgrind检测:
这次则显示我们申请并且释放了400B的空间,体现了valgrind的强大作用。
有这样的检错工具当然很好,但是我更认为程序员应该始终头脑清醒,知道自己的程序在做什么,记得这个忠告,如果你的语言没有垃圾回收机制。那么在申请一块内存之后先不要做任何操作,先在合适的位置释放内存。毕竟好借好还,再借不难么。本文出自:
亿恩郑州公司(总部):
经营性ICP/ISP/IDC证:豫B1.B2-
地址:郑州市高新区翠竹街1号总部企业基地亿恩大厦
亿恩南昌公司:
经营性ICP/ISP证:赣B2-
地址:南昌市洪城路国贸广场A区巨豪峰13层
服务器/云主机 24小时售后服务电话:0
虚拟主机/智能建站 24小时售后服务电话:3
扫扫关注-微信公众号
400-723-6868
Help center
ENKJ All Rights Reserved 亿恩科技 版权所有   亿恩科技法律顾问:河南三融律师事务所周跃、裴松龄律师  
  经营性ICP/ISP证:京B2-

我要回帖

更多关于 linux java 内存溢出 的文章

 

随机推荐