博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内存泄露bug指南(一)
阅读量:4877 次
发布时间:2019-06-11

本文共 2465 字,大约阅读时间需要 8 分钟。

内存泄露bug指一个内存由操作系统或内部内存“池”分配,但是用完后从未收回。这实际上是资源回收的失职。有些人以为内存泄露只在支持内存分配并提供内存重分配方法的语言中出现。例如:C#和java不会导致这种错误,因为它们不支持内存分配,或者有一个垃圾收集机制,即在内存区长期不使用时自动释放。事实不只这么简单。资源泄露可以出现于任何语言,而且常常是因为编程错误而起。

症状:其症状往往是系统变慢或者突然崩溃,以及其他奇怪的症状。最容易发现的是系统的内存(或资源)在一段时间内减少而且不恢复。可以使用很多管理工具和命令、脚本等观察程序是否有内存泄露。

RSS: "Resident Set Size", 实际驻留"在内存中"的内存数. 不包括已经交换出去的代码. 举一个例子: 如果你有一个程序使用了100K内存, 操作系统交换出40K内存, 那么RSS为60K. RSS还包括了与其它进程共享的内存区域. 这些区域通常用于libc库等.

程序内存的信息(/proc/self/smaps):

VMSIZE:      15316 KB

RSS:          2560 KB total
              1152 KB shared
               428 KB private clean
               980 KB private dirty

RSS(private dirty)最接近程序所使用的内存,特别是从heap分配的内存。

这也是我们最关心地方: 进程实际占用的内存数.

下面看一个C程序中常见的内存泄露错误(最简单的例子)。这种bug最讨厌,因为内存有时被收回,有时却没有。

test_memleak.cpp

#include 
#include
#include
#include
int fun(void){ return (rand()>>3)%2;}int main(){ srand( (unsigned)time(NULL)); int n=100; int *buffer=new int[n+1]; memset(buffer,0,n+1); if (fun())//sim error in the processing piece { printf("An error occurred.Skipping final stage\n"); return -1; } delete [] buffer; return 0;}

正常情况下,这段代码工作正常。如果某个业务处理没有错误,内存就会正常的释放。但如果出现错误,则不能被释放,就出现了泄露。当然使用过C++的人会告诉你使用“智能指针”,它们可以自动地释放自己所指向的内存。如果指针式全局的,没办法智能靠编程人员自动动手完成了。

作为测试人员通过哪些手段发现程序的内存泄露呢?查找内存泄露的工具至少二十种以上,以前用过DTrace,linux下改成systemtap,不过基本原理是一样的,感兴趣的请阅读我的其他文章,此工具使用起来还是比较麻烦。还有比较流行的工具Valgrind,大多数C程序员都接触过,个人感觉查找内存泄露过程中较大的影响应用的性能。看过google perftools工具箱中,提供Heap Checker堆内存泄漏检测工具,使用简单,并能够动态检测。

HeapChecker包括normal在内总共有4种泄漏检查方式:minimal,忽略进入main函数之前的初始化过程;normal,报告所有的无法再引用的内存对象;strick,在normal的基础上增加一些额外的检查;draconian,在程序退出的时候存在未释放的内存的情况下报错。

先在链接被检查程序的时候用-ltcmalloc选项连接GoolgePerftools的堆内存管理库tcmalloc(tcmalloc会替代C的堆内存管理库),然后每次用命令行“env HEAPCHECK=normal 可执行程序路径”来进行检查,其中检查形式normal可以替换成其他值,检查的结果会以屏幕报告的形式给出。

g++ -O0 -g test_memleak.cpp -ltcmalloc -o test_memleak

env HEAPCHECK=normal /root/src/test_memleak

 [root@s144 src]# env HEAPCHECK=normal /root/src/test_memleak

WARNING: Perftools heap leak checker is active -- Performance may suffer
No leaks found for check "_main_" (but no 100% guarantee that there aren't any): found 17 reachable heap objects of 710 bytes
[root@s144 src]# env HEAPCHECK=normal /root/src/test_memleak
WARNING: Perftools heap leak checker is active -- Performance may suffer
No leaks found for check "_main_" (but no 100% guarantee that there aren't any): found 17 reachable heap objects of 710 bytes

 

转载于:https://www.cnblogs.com/jinyz/archive/2013/05/09/3066782.html

你可能感兴趣的文章
jsp/post中文乱码问题
查看>>
C# 插入或删除word分页符
查看>>
数据库数据的查询----连接查询
查看>>
Git使用教程【转】
查看>>
html图片设置fixed消失,为什么fixed后,DIV7消失了,怎么显示出来?
查看>>
html5隐藏自定义控制按钮,用仿ActionScript的语法来编写html5——第七篇,自定义按钮...
查看>>
找不到可安装的ISAM ,asp.net读取数据丢失,解决的一列里有字符与数字的
查看>>
Java学习笔记三(对象的基本思想一)
查看>>
Bezier贝塞尔曲线的原理、二次贝塞尔曲线的实现
查看>>
Java程序(文件操作)
查看>>
Alignment (DP基础--最长上升子序列)
查看>>
SPF(图的割点)
查看>>
KMP算法的Next数组详解
查看>>
Brackets (区间DP)
查看>>
Tarjan算法
查看>>
Strategic Game(树形DP)
查看>>
迷宫城堡 (求强连通)
查看>>
Oulipo (KMP 统计出现次数,裸题)
查看>>
图的割点算法 与 图的割边算法
查看>>
KMP算法 最小循环节 最大重复次数
查看>>