1.安装valgrind

sudo apt-get install valgrind

2. Valgrind的使用

为了使valgrind发现的错误更精确,如能够定位到源代码行,建议在编译时加上-g参数,编译优化选项请选择O0,虽然这会降低程序的执行效率。

这里用到的示例程序文件名为:test.c,选用的编译器为gcc。

生成可执行程序

gcc -g -O0 test.c -o test

生成可执行程序test之后,如何使用Valgrind来生成内存的记录文件呢?一般这样使用:

valgrind --leak-check=full --log-file=test_valgrind.log --num-callers=30 ./test
  • --log-file 后面的test_valgrind.log是指定生成的日志文件名称。

  • --num-callers 后面的60是生成的每个错误记录的追踪行数。30是随便设定的,如果没指定,默认是12行貌似(有可能有的追踪行就没显示)。

  • --leak-check=full 表示开启详细的内存泄露检测器。


ubuntu在终端检测C代码内存泄漏错误

C代码:

[cpp] view plain copy print ?
  1. #include<stdlib.h>
  2. int*func(void)
  3. {
  4. int*x=malloc(10*sizeof(int));
  5. x[0]=0;//问题1:数组下标越界
  6. }
  7. intmain(void)
  8. {
  9. printf("abc\n");
  10. int*x=NULL;
  11. x=func();
  12. free(x);
  13. printf("cccc----\n");
  14. x=NULL;
  15. return0;//问题2:内存没有释放
  16. }

编译

gcc -g -o test test.c

内存检查
valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./test

结果:
[html] view plain copy print ?
  1. XXXXXXXX@Mountain:~/C_Project$valgrind--tool=memcheck--leak-check=yes--show-reachable=yes./test
  2. ==3361==Memcheck,amemoryerrordetector
  3. ==3361==copyright(C)2002-2011,andGNUGPL'd,byJulianSewardetal.
  4. ==3361==UsingValgrind-3.7.0andLibVEX;rerunwith-hforcopyrightinfo
  5. ==3361==Command:./test
  6. ==3361==
  7. abc
  8. ==3361==Invalidwriteofsize4
  9. ==3361==at0x804842F:func(test.c:5)
  10. ==3361==by0x8048458:main(test.c:12)
  11. ==3361==Address0x41f2050is0bytesafterablockofsize40alloc'd
  12. ==3361==at0x402BE68:malloc(in/usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
  13. ==3361==by0x8048425:func(test.c:4)
  14. ==3361==by0x8048458:main(test.c:12)
  15. ==3361==
  16. cccc----
  17. ==3361==
  18. ==3361==HEAPSUMMARY:
  19. ==3361==inuseatexit:40bytesin1blocks
  20. ==3361==totalheapusage:1allocs,0frees,40bytesallocated
  21. ==3361==
  22. ==3361==40bytesin1blocksaredefinitelylostinlossrecord1of1
  23. ==3361==at0x402BE68:malloc(in/usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
  24. ==3361==by0x8048425:func(test.c:4)
  25. ==3361==by0x8048458:main(test.c:12)
  26. ==3361==
  27. ==3361==LEAKSUMMARY:
  28. ==3361==definitelylost:40bytesin1blocks
  29. ==3361==indirectlylost:0bytesin0blocks
  30. ==3361==possiblylost:0bytesin0blocks
  31. ==3361==stillreachable:0bytesin0blocks
  32. ==3361==suppressed:0bytesin0blocks
  33. ==3361==
  34. ==3361==Forcountsofdetectedandsuppressederrors,rerunwith:-v
  35. ==3361==ERRORSUMMARY:2errorsfrom2contexts(suppressed:0from0)
内存读写错误:
[html] view plain copy print ?
  1. ==3361==Invalidwriteofsize4
  2. ==3361==at0x804842F:func(test.c:5)

内存泄漏:

[html] view plain copy print ?
  1. ==3361==LEAKSUMMARY:
  2. ==3361==definitelylost:40bytesin1blocks
  3. ==3361==indirectlylost:0bytesin0blocks

当将错误修改后:的输出为:

[html] view plain copy print ?
  1. XXXXXXX@Mountain:~/C_Project$valgrind--tool=memcheck--leak-check=yes--show-reachable=yes./test
  2. ==3383==Memcheck,amemoryerrordetector
  3. ==3383==copyright(C)2002-2011,byJulianSewardetal.
  4. ==3383==UsingValgrind-3.7.0andLibVEX;rerunwith-hforcopyrightinfo
  5. ==3383==Command:./test
  6. ==3383==
  7. abc
  8. cccc----
  9. ==3383==
  10. ==3383==HEAPSUMMARY:
  11. ==3383==inuseatexit:0bytesin0blocks
  12. ==3383==totalheapusage:1allocs,1frees,40bytesallocated
  13. ==3383==
  14. ==3383==Allheapblockswerefreed--noleaksarepossible
  15. ==3383==
  16. ==3383==Forcountsofdetectedandsuppressederrors,rerunwith:-v
  17. ==3383==ERRORSUMMARY:0errorsfrom0contexts(suppressed:0from0)

很明显,已经没有错误了。


但是这里有一个问题,就是我们还无法判断内存具体泄漏的位置,待我研究后再修改此篇文章。

ubuntu下Qt Creator使用valgrind检测内存泄漏的更多相关文章

  1. ios – 为什么重复创建和删除SKShapeNode和SKNode导致内存泄漏?

    使用Xcode附带的spritekit模板,我修改场景如下:该应用程序似乎继续使用更多内存,直到它挂起或崩溃.使用泄漏和分配工具,我发现了以下内容:泄漏:分配:从图像中可以看出,存在大量使用内存的Malloc调用.我不直接调用Malloc–似乎这些调用是由SpriteKit完成的.同样,存在许多内存泄漏,这似乎也是由于SKShapeNode,SKNode或其他SpriteKit对象造成的.我如何解决或解决此内存(泄漏)问题?

  2. ios – Xcode显示内存泄漏,但仪器没有

    当我从Xcode运行我的应用程序时,很明显我有一个内存泄漏:当我提供一个自定义的ViewController时,内存增加,但是当我关闭它时,它不会退回.所以我也检查了使用仪器的分配工具,但这说明了一个不同的故事:可以看出,当我呈现ViewController时,仪器会显示尖峰,但是当内存使用被关闭时,内存使用率将恢复到以前的级别.我已经检查了我的代码至少15次,我个人无法找到任何内存泄漏,因此同意

  3. ios – 内存泄漏与UIWebView和Javascript

    清楚地包含一个Javascript文件到我的HTML是使UIWebView泄漏内存.当我重复使用相同的UIWebView对象时,或者每当我有内容实例化一个新的漏洞时,会出现泄漏的事实,导致我认为必须有一些JavaScript文件被loadHTMLString处理,导致泄漏.有人知道如何解决这个问题吗?

  4. ios – SBJson – 有内存泄漏?

    我刚刚克隆了SBJson框架的git存储库,并将源代码导入到我的应用程序中.跑了一个静态内存探查器,并从我看到的结果有点害怕.看图这怎么可能?我怀疑这个知名图书馆的开发者没有看到这个?事实上,如果运行内存配置文件,它会显示此库中的内存泄漏.有任何想法吗?

  5. 14.6 Swift中weak解决循环强引用

    /**循环强引用ARC不是万能的,它可以很好的解决内存过早释放的问题,但是在某些场合下不能很好的解决内存泄漏的问题。直接用官方例子*/classPerson{letname:Stringinit{self.name=name}varapartment:Apartment?这就是所谓的循环强引用*///这是强引用,不要认为可选类型就是弱引用啊,只有通过weakuNowned才是弱引用varjohn:Person?*//**在变量tenant前加上weak修饰,也就是将其中的一个变量设置为弱引用就行了。joh

  6. Swift闭包中的内存泄漏

    内存泄漏不仅破坏用户体验,而且会影响性能甚至应用的安全。既然内存泄漏如此的重要,所以这篇文章在这篇文章将说一说Swift闭包中的内存泄漏问题。Apple在文章中详细介绍了循环强引用的概念、何为内存泄漏、如何避免。内存泄漏的调试上面我们分析了大部分闭包中的循环引用问题,我们得知并不是所有的情况下都会导致内存泄漏。

  7. Android – 从低内存条件恢复

    我正在开发一个非常强烈的图像处理应用程序,我在水平FragmentStatePagerAdapter中有多个ListFragments.我积极地采用几乎每一个窍门和建议,我能够在这里和其他地方找到.我下载位图并将其保存到SD和软参考存储器缓存.然而,当我在某些时候使用该应用程序,我开始在LogCat中看到消息,就像下面一样如果我继续,上面的消息将变得更加迫切并且不可避免的应用程序将与OutOfMe

  8. Android内存泄漏的原因及解决技巧

    这篇文章主要介绍了Android内存泄漏的原因及解决技巧,帮助大家更好的利用Android进行开发,感兴趣的朋友可以了解下

  9. nodeJs内存泄漏问题详解

    由于内存泄漏在Node.js中非常的常见,可能在浏览器中应用javascript时,对于其内存泄漏不是特别敏感,但作为服务器语言运行时,你就不得不去考虑这些问题。

  10. vue中的eventBus会不会产生内存泄漏你知道吗

    这篇文章主要为大家详细介绍了vue中的eventBus会不会产生内存泄漏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

随机推荐

  1. crontab发送一个月份的电子邮件

    ubuntu14.04邮件服务器:Postfixroot收到来自crontab的十几封电子邮件.这些邮件包含PHP警告.>我已经解决了这些警告的原因.>我已修复每个cronjobs不发送电子邮件(输出发送到>/dev/null2>&1)>我删除了之前的所有电子邮件/var/mail/root/var/spool/mail/root但我仍然每小时收到十几封电子邮件.这些电子邮件来自cronjobs,

  2. 模拟两个ubuntu服务器计算机之间的慢速连接

    我想模拟以下场景:假设我有4台ubuntu服务器机器A,B,C和D.我想在机器A和机器C之间减少20%的网络带宽,在A和B之间减少10%.使用网络模拟/限制工具来做到这一点?

  3. ubuntu-12.04 – 如何在ubuntu 12.04中卸载从源安装的redis?

    我从源代码在Ubuntu12.04上安装了redis-server.但在某些时候它无法完全安装,最后一次makeinstallcmd失败.然后我刚刚通过apt包安装.现在我很困惑哪个安装正在运行哪个conf文件?实际上我想卸载/删除通过源安装的所有内容,只是想安装一个包.转到源代码树并尝试以下命令:如果这不起作用,您可以列出软件自行安装所需的步骤:

  4. ubuntu – “apt-get source”无法找到包但“apt-get install”和“apt-get cache”可以找到它

    我正在尝试下载软件包的源代码,但是当我运行时它无法找到.但是当我运行apt-cache搜索squid3时,它会找到它.它也适用于apt-getinstallsquid3.我使用的是Ubuntu11.04服务器,这是我的/etc/apt/sources.list我已经多次更新了.我尝试了很多不同的debs,并没有发现任何其他地方的错误.这里的问题是你的二进制包(deb)与你的源包(deb-src)不

  5. ubuntu – 有没有办法检测nginx何时完成正常关闭?

    &&touchrestarted),因为即使Nginx没有完成其关闭,touch命令也会立即执行.有没有好办法呢?这样的事情怎么样?因此,pgrep将查找任何Nginx进程,而while循环将让它坐在那里直到它们全部消失.你可以改变一些有用的东西,比如睡1;/etc/init.d/Nginx停止,以便它会休眠一秒钟,然后尝试使用init.d脚本停止Nginx.你也可以在某处放置一个计数器,这样你就可以在需要太长时间时发出轰击信号.

  6. ubuntu – 如何将所有外发电子邮件从postfix重定向到单个地址进行测试

    我正在为基于Web的应用程序设置测试服务器,该应用程序发送一些电子邮件通知.有时候测试是使用真实的客户数据进行的,因此我需要保证服务器在我们测试时无法向真实客户发送电子邮件.我想要的是配置postfix,以便它接收任何外发电子邮件并将其重定向到一个电子邮件地址,而不是传递到真正的目的地.我正在运行ubuntu服务器9.10.先感谢您设置本地用户以接收所有被困邮件:你需要在main.cf中添加:然后

  7. ubuntu – vagrant无法连接到虚拟框

    当我使用基本的Vagrantfile,只配置了两条线:我看到我的虚拟框打开,但是我的流氓日志多次显示此行直到超时:然后,超时后的一段时间,虚拟框框终于要求我登录,但是太久了!所以我用流氓/流氓记录.然后在我的物理机器上,如果我“流氓ssh”.没有事情发生,直到:怎么了?

  8. ubuntu – Nginx – 转发HTTP AUTH – 用户?

    我和Nginx和Jenkins有些麻烦.我尝试使用Nginx作为Jenkins实例的反向代理,使用HTTP基本身份验证.它到目前为止工作,但我不知道如何传递带有AUTH用户名的标头?}尝试将此指令添加到您的位置块

  9. Debian / Ubuntu – 删除后如何恢复/ var / cache / apt结构?

    我在ubuntu服务器上的空间不足,所以我做了这个命令以节省空间但是现在在尝试使用apt时,我会收到以下错误:等等显然我删除了一些目录结构.有没有办法做apt-getrebuild-var-tree或类似的?

  10. 检查ubuntu上安装的rubygems版本?

    如何查看我的ubuntu盒子上安装的rubygems版本?只是一个想法,列出已安装的软件包和grep为ruby或宝石或其他:)dpkg–get-selections

返回
顶部