内存泄露,越界,数据竞争检测

一、内存泄露

1、使用自定义的组件申请释放内存,即定义统一接口例如alloc()和free()以供系统中所有操作内存的地方使用,每次申请内存将调用栈信息以一个结构体形式保存到一个容器里面,每次释放内存将对于的调用栈信息从容器里面删除,这样在程序结束的时候便可以统计内存的使用,若程序正常结束,无内存泄露,则容器的大小为0,否则就是出现了内存泄露,将容器中堆栈信息打印出来,通过堆栈,使用addr2line便可以找到哪里出现了泄露。

2、重定义malloc和free,重载操作符new和delete,方法同上,每次操作内存都将对应的调用栈信息保存起来,以统计内存使用情况。

二、内存越界

内存越界检查使用clang和clang++编译器,加上-address选项(高版本的gcc,g++也有内存越界检查的功能,4.8版本以上加上编译选项-address即可检查)

三、数据竞争问题

Data Race是指多个线程在没有正确加锁的情况下,同时访问同一块数据,并且至少有一个线程是写操作,对数据的读取和修改产生了竞争,从而导致各种不可预计的问题。

Data Race的问题比较难查,Data Race一旦发生,结果是不可预期的,也许直接就Crash了,也许导致执行流程错乱了,也许把内存破坏导致之后某个时刻突然Crash了。

数据竞争问题的检查也是使用clang和clang++编译器,加上-fsanitize=thread选项,(高版本的gcc,g++同样支持)。

四、几个内存问题检查工具介绍

1.clang编译器

clang是llvm的一部分,相比于gcc,clang有一些优势,最突出的三点就是:编译速度快,占用的内存少,诊断信息可读性强。

clang编译器可以检查内存越界,数据竞争,此外它还可以检查内存泄露,内存是否初始化等。

以下是clang编译器的功能,详情http://clang.llvm.org/docs/index.html

 

2.TcMalloc

TcMalloc也有内存问题检查的功能,不过它最大的功能是在提升系统性能上,内存检查功能的信息可读性比较差,而且检查不是特别充分。

TcMalloc是google-perftools工具中的一个内存管理库,与标准的glibc库中malloc相比,TcMalloc在内存分配的效率和速度上要高很多,通常情况下ptmalloc2能在300ns执行一个malloc和free对,而TcMalloc能在50ns内执行一个malloc和free对。

可以提升高并发情况下的性能,降低系统的负载。

TcMalloc可以减少多线程程序之间的锁争用问题,在小对象上能达到零争用。

TcMalloc为每个线程单独分配一个线程本地的Cache,少量的地址分配就直接从Cache中分配,并且定期做垃圾回收,将线程本地Cache中的空闲内存返回给全局控制堆。

TcMalloc认为小于(<=)32K为小对象,大对象直接从全局控制堆上以页(4K)为单位进行分配,也就是说大对象总是页对齐的。

TcMalloc中一个页可以存入一些相同大小的小对象,小对象从本地内存链表中分配,大对象从中心内存堆中分配。

3.Valgrind

Valgrind的memcheck这个工具可以检查如下内存问题:

1)使用未初始化的内存

2)读/写已经被释放的内存

3)读/写内存越界

4)读/写不恰当的内存栈空间

5)内存泄漏

6)使用malloc/new/new[]和free/delete/delete[]不匹配 

 

优点:从上面的功能可以看出,强大,覆盖面很广泛,而且提示信息友好,充分。

缺点:先从工作原理说起:Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件(plug-in),利用内核提供的服务完成各种特定的内存调试任务。

 

从原理图可看出,它为了覆盖面广泛,设计的比较复杂,所以当在大型程序中使用时,会出现反应时间较长的问题,即效率很低。

转载于:https://www.cnblogs.com/LyndonYoung/articles/5702470.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值