注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mie

 
 
 

日志

 
 

使用libuv的一处内存溢出bug分析  

2014-07-07 18:11:12|  分类: 网络开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

基于libuv进行大量的连接/断开测试,大约在十万次操作之后,进程崩溃。为此,我进行了如下测试。

 

最初,我把原因归结于自己不熟悉libuv的用法,使用方法不当。因此,也走了很多弯路。每次都得进行数十万次操作才会出现,重现概率较低,导致分析难度加大。

 

现象:

HEAP: Free Heap block xxxx  modified at xxxx after it was freed.

 

跟踪之后发现,一处内存块被0xF0填充了!!!之后,再free这个错误的内存块,再malloc,就出现异常。

我最初认为,可能是debug的malloc做了过多的判断,导致内存分配 释放出现不必要的断言错误。于是,自己创建了Heap来取代malloc free。然而问题依旧。

内存被覆写,然而这个被覆写的内存块,除了libuv中使用,就是一个set数据结构来维护的。难道是set导致的?我去掉了set,程序似乎稳定了更长的时间,但是,free的时候还是崩溃了。看来只能是libuv的问题了?

 

我想知道是哪个地方错误地修改了内存区域。由于内存操作过于频繁,所以,常规的方法是不管用的,那就只能自己写工具,我也不愿意在这上面花过多时间,这个方案也是不行的。

 

于是,我异想天开地在HeapFree之前,对内存区域的数据做了判断,判断是否被覆写为0xF0。结果,意外的情况发生了!HeapFree之前,内存区域正常;free出现异常时,内存区域被覆写为0xF0。也就是说,发生问题时,其实是HeapFree中在修改内存。。。

 

原因找到了,,,于是我对HeapFree的返回值进行判断,我想,是不是某次free失败导致的?结果是,问题不再出现,,,而libuv的其他代码老是出现异常。。

由此,也基本上推断出原因。其一,程序是没有问题的;二,HeapFree也是正常的。原因就在于libuv中的频繁IOCP请求,而最有可能的是,我错误地回收了IOCP请求的内存块(以前自写的IOCP模块中曾遇到过类似的问题)。

由于系统过于繁忙(投递了过多的IOCP),导致很多未被处理的请求,对这些请求,我很可能过早地回收了buf(我没有去跟进相关libuv代码,只是推测)。进而导致程序运行出错。

 

由于是做压力测试,工具本身的性能要求还是比较高的,所以我测试的时候都是以极端方式测试,这也就导致我过多地纠结于不该纠结的问题上。

 

接:http://zhanyonhu.blog.163.com/blog/static/16186044201468102732585/

By:zhanyonhu

  评论这张
 
阅读(790)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016