免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 866 | 回复: 0
打印 上一主题 下一主题

Linux下检查内存泄漏,系统性能的系列工具(一) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-02 11:00 |只看该作者 |倒序浏览

在我先前的博客文章中我介绍了如何在Windows .NET环境下如何定位内存泄漏问题,今天我就来介绍一个在Linux下定位此类问题的工具Valgrind和Callgrind,以及基于Callgrind分析结果的GUI分析工具KCachegrind。Callgrind和KCachegrind在后面的专题讲。
?
首先介绍Valgrind,网址是:
http://valgrind.org/
,简述如下:
With the tools that come with Valgrind, you can automatically detect many memory management and threading bugs, avoiding hours of frustrating bug-hunting, making your programs more stable.
Valgrind是一个工具集,目前包括如下工具:
?
- Memcheck,主要是针对C/C++程序,所有对内存的读写均被其检查,所以调用malloc/new/free/delete等操作均为截获。错误发生时,Memcheck会立即报告相关源代码行号,以及调用函数。Memcheck的寻址能力是字节级,对于内存初始化的追踪可以达到比特级。在Memcheck下运行待检测程序,速度会比正常慢10到30倍。
?
- Addrcheck,是Memcheck的轻量级版本,它不作内存初始化的检查,所以它检测的错误少一些,但效率是前者2倍,是正常程序运行时间的5到20倍的样子。
?
- Cachegrind,是一个Cache的仿真检视器,它在CPU上对I1,D1和L2级的Cache进行了细致的仿真,所以它可以精确地查明代码中Cache流失的来源。它可以识别Cache流失的数量,内存索引的数量,每一行代码执行的指令的数量,并且可以提供每一个函数,模块,以及整个程序的总结。它对于任何语言都是有用的,
Cachegrin加载程序运行起来,会是平时时间的20到100倍长。
?
- Massif,是堆Heap的仿真检视器,它对程序堆状况定时来取一次快照,并且产生一个随时间变化的堆的开销图,其中还指示出了哪些程序分配了哪些堆空间。Massif加载程序会是平时时间的20倍之慢。
?
- Helgrind,是用来发现多线程程序的数据资源竞争的调试器。它可以寻找被多个POSIX线程访问的内存空间,但除过哪些没有用(pthread_mutex_) 线程信号量加锁的内存空间。它可以指示出线程间的不同步,并且发现很难发现的时间依赖问题。
Valgrind安装指南参考:
http://www-numi.fnal.gov/offline_software/srt_public_context/WebDocs/valgrind.html
?
Valgrind的Memcheck使用举例:
假定你当前的程序,myprog arg1 arg2
若使用Memcheck,命令如下:
valgrind --leak-check=yes myprog arg1 arg2
Memcheck是Valgrind的缺省工具。--leak-check选项将打开内存泄漏的详细检测器。
如果说你的内存泄漏错误代码,即myprog如下所示:
(1)? #include
(2)
(3) void f(void)
(4) {
(5)???? int* x = malloc(10 * sizeof(int));
(6)???? x[10] = 0;??????? // problem 1: heap block overrun
(7) }??????????????????? // problem 2: memory leak -- x not freed
(8)
(9)? int main(void)
(10) {
(11)??? f();
(12)??? return 0;
(13) }
运行过程中,问题1的错误指示消息将会显示出来,主要是内存越界
? ==19182== Invalid write of size 4
? ==19182==??? at 0x804838F: f (example.c:6)
? ==19182==??? by 0x80483AB: main (example.c:11)
? ==19182== Address 0x1BA45050 is 0 bytes after a block of size 40 alloc'd
? ==19182==??? at 0x1B8FF5CD: malloc (vg_replace_malloc.c:130)
? ==19182==??? by 0x8048385: f (example.c:5)
? ==19182==??? by 0x80483AB: main (example.c:11)
对于问题2,内存泄漏的消息如下所示:
? ==19182== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
? ==19182==??? at 0x1B8FF5CD: malloc (vg_replace_malloc.c:130)
? ==19182==??? by 0x8048385: f (a.c:5)
? ==19182==??? by 0x80483AB: main (a.c:11)
怎么样?这里只是一个非常简单的例子,你不妨可以一试。

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/19942/showart_454774.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP