0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

检测内存泄漏和内存违例,Valgrind不可少!

C语言专家集中营 来源:互联网 作者:佚名 2018-05-07 08:45 次阅读

Valgrind可以检测内存泄漏和内存违例,但是用Valgrind生成的日志信息结合kcachegrind就可以查看C程序的执行线路图,调用时间,是做性能优化和查看代码的非常好的工具。

1.下载安装

Valgrind 安装

到www.valgrind.org下载最新版valgrind

#wgethttp://www.valgrind.org/downloads/valgrind-3.9.0.tar.bz2#tar -xvf valgrind-3.9.0.tar.bz2#cd valgrind-3.9.0#./configure#make && make install

2.Valgrind说明Valgrind的使用非常简单,valgrind命令的格式如下:valgrind [valgrind-options] your-prog [your-prog options]一些常用的选项如下:选项作用-h --help显示帮助信息。--version显示valgrind内核的版本,每个工具都有各自的版本。-q --quiet安静地运行,只打印错误信息。-v --verbose打印更详细的信息。--tool= [default: memcheck]最常用的选项。运行valgrind中名为toolname的工具。如果省略工具名,默认运行memcheck。--db-attach= [default: no]绑定到调试器上,便于调试错误。

3.使用Valgrind分析Nginx

这是正常的Nginx的启动命令

#/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

使用Valgrind的callgrind来分析一下程序的效率

#valgrind --tool=callgrind /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

按Ctrl+C结束,在valgrind安装目录生成callgrind.out.2026文件

4.kcachegrind图形化显示

使用kcachegrind工具打开,右键导出图片

1).总览图

可以右键调整图形

2).程序模块执行百分比图

3).程序模块调用关系图

#valgrind --tool=callgrind /etc/init.d/php-fpm

PHP-FPM分析图

更复杂了

5.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可以把这个文件的内容转化成可读的形式。 比起Cachegrind而言Callgrind更有用。Callgrind在Cachegrind基础上实现,可以可视化展示函数调用关系,以及每个函数在整个进程运行过程中所占的成本

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

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

5). Massif堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。此外,lackey和nulgrind也会提供。Lackey是小型工具,很少用到;Nulgrind只是为开发者展示如何创建一个工具。我们就不做介绍了。

6.Valgrind分析内存泄漏

  1. #include

  2. #include

  3. voidf(void)

  4. {

  5. int*x=malloc(10*sizeof(int));

  6. x[10]=0;//problem1:heapblockoverrun

  7. }//problem2:memoryleak--xnotfreed

  8. intmain(void)

  9. {

  10. inti=0;

  11. f();

  12. printf("i=%d/n",i);//problem3:useuninitialisedvalue.

  13. return0;

  14. }

保存为memleak.c并编译,然后用valgrind检测。# cc -Wall -o memleak memleak.c#valgrind --tool=memcheck ./memleak

前面的2405是程序运行时的进程号。第一行是告诉我们错误类型,这里是非法写入。下面的是告诉我们错误发生的位置,在main()调用的f()函数中。在程序运行结束后,valgrind还给出了一个小的总结SUMMARY.我们可以很清楚地看出,分配和释放了多少内存,有多少内存泄漏。这对我们查找内存泄漏十分方便.

重新编译程序并绑定调试器:# gcc -Wall -ggdb -o memleak memleak.c#valgrind --db-attach=yes --tool=memcheck ./memleak一出现错误,valgrind会自动启动调试器(一般是gdb):

#valgrind --tool=cachegrind ./memleak

上面的是指令缓存,I1和L2i缓存,的访问信息,包括总的访问次数,丢失次数,丢失率。中间的是数据缓存,D1和L2d缓存,的访问的相关信息,下面的L2缓存单独的信息。Cachegrind也生成一个文件,名为cachegrind.out.pid,可以通过cg_annotate来读取。输出是一个更详细的列表。Massif的使用和cachegrind类似,不过它也会生成一个名为massif.pid.ps的PostScript文件,里面只有一幅描述堆栈使用状况的彩图。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7529

    浏览量

    128469
  • Valgrind
    +关注

    关注

    0

    文章

    9

    浏览量

    6764

原文标题:使用valgrind分析C程序调用线路图

文章出处:【微信号:C_Expert,微信公众号:C语言专家集中营】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    写了一个内存泄漏检查工具

    嵌入式环境内存泄漏检查比较麻烦,valgrind比较适合于在pc上跑,嵌入式上首先移植就很麻烦,移植完了内存比较小,跑起来也比较费劲。所以手动写了一个
    发表于 12-17 08:25

    如何编译使用内存泄漏的定位工具

    1.我们知道有个内存泄漏的定位工具: valgrind, 非常优秀。现在已经支持arm版本,下面看看如何编译使用:2.下载源码:
    发表于 12-17 08:13

    C++内存泄漏检测拾遗

    在MFC开发环境中,当运行退出了,Visual Studio会在输出窗口提示是否有内存泄漏。也可以借助MFC类CMemoryState动态地检测并输出内存
    发表于 05-27 09:59 891次阅读

    Linux C/C++内存泄漏检测工具:Valgrind

    C++中的new和delete),找出内存泄漏问题。  Valgrind 中包含的 Memcheck 工具可以检查以下的程序错误:  使用未初始化的内存 (Use of uniniti
    发表于 04-02 14:33 444次阅读

    内存泄漏检测方法

    的。其实不然,防止内存泄露要从良好的编程习惯做起,另外重要的一点就是要加强单元测试(Unit Test),而valgrind就是这样一款优秀的工具。
    的头像 发表于 06-20 11:01 2829次阅读

    什么是内存泄漏内存泄漏有哪些现象

    内存泄漏几乎是很难避免的,不管是老手还是新手,都存在这个问题,甚至 Windows 与 Linux 这类系统软件也或多或少存在着内存泄漏
    的头像 发表于 09-05 17:24 8938次阅读

    valgrind检测内存问题的原理

    valgrind 是一个提供了一些 debug 和优化的工具的工具箱,可以使得你的程序减少内存泄漏或者错误访问。valgrind 默认使用 memcheck 去检查
    的头像 发表于 05-23 09:30 1148次阅读
    <b class='flag-5'>valgrind</b><b class='flag-5'>检测</b><b class='flag-5'>内存</b>问题的原理

    怎么解决C语言中的内存泄漏问题呢?

    只有在堆内存里面才会发生内存泄漏的问题,在栈内存中不会发生内存泄漏。因为栈
    发表于 06-11 17:31 390次阅读
    怎么解决C语言中的<b class='flag-5'>内存</b><b class='flag-5'>泄漏</b>问题呢?

    如何使用valgrind对代码进行内存泄露检测

    代码可能存在 内存泄露 怎么办? 使用 valgrind 可以对代码进行内存泄露检测valgrind下载安装 安装: 1 、tar –j
    的头像 发表于 10-04 14:56 390次阅读
    如何使用<b class='flag-5'>valgrind</b>对代码进行<b class='flag-5'>内存</b>泄露<b class='flag-5'>检测</b>

    什么是内存泄漏?如何避免JavaScript内存泄漏

    JavaScript 代码中常见的内存泄漏的常见来源: 研究内存泄漏问题就相当于寻找符合垃圾回收机制的编程方式,有效避免对象引用的问题。
    发表于 10-27 11:30 126次阅读
    什么是<b class='flag-5'>内存</b><b class='flag-5'>泄漏</b>?如何避免JavaScript<b class='flag-5'>内存</b><b class='flag-5'>泄漏</b>

    如何写一个内存泄漏检测工具

    如何确定有内存泄露问题,如何定位到内存泄露位置,如何写一个内存泄漏检测工具? 1:概述 内存泄露本质:其实就是申请调用malloc/new,
    的头像 发表于 11-11 16:19 516次阅读

    线程内存泄漏问题的定位

    记录一个关于线程内存泄漏问题的定位过程,以及过程中的收获。 1. 初步定位 是否存在内存泄漏:想到内存
    的头像 发表于 11-13 11:38 321次阅读
    线程<b class='flag-5'>内存</b><b class='flag-5'>泄漏</b>问题的定位

    如何发现内存泄漏

    检测两个角度介绍在 Linux 环境进行内存泄漏检测的方法,并重点介绍静态分析工具 BEAM、动态监测工具 Valgrind 和 rational purify 的使用方法。相信通过本
    的头像 发表于 11-13 15:41 278次阅读

    ug内部错误,内存访问违例怎么解决

    ug内部错误,内存访问违例怎么解决 内部错误和内存访问违例是编程中常见的问题,它们可能会导致应用程序崩溃、数据丢失或系统不稳定。在本文中,我将详细解释内部错误和
    的头像 发表于 12-27 16:27 3299次阅读

    C语言内存泄漏问题原理

    内存泄漏问题只有在使用堆内存的时候才会出现,栈内存不存在内存泄漏问题,因为栈
    发表于 03-19 11:38 162次阅读
    C语言<b class='flag-5'>内存</b><b class='flag-5'>泄漏</b>问题原理