linux下调试内存泄露笔记

第一次写博客,记录一下工作中遇到的问题和解决方法。

在压力测试可视对讲门口机时,发现在PC端队门口机不停的呼叫,挂机,用不了多久门口机就会死机。 于是用telnet登陆门口机,用top查看进程使用情况,发现 %MEM的使用量在不停的增加,最后超过120%的时候,进程被系统杀掉,并抛出内存溢出的错误信息。 由于buzybox没有内存泄露工具可用,只能从代码端开始分析,采用方式:

        1,确定泄露的位置。由于在呼叫时才出现泄露的情况,首先屏蔽掉呼叫接通后的系列动作,只回复协议。多次测试并未发现再次出现泄露问题,因此确定是呼叫之后建立RTP连接后造成的泄露。

        2,检查代码未发现malloc没有free的情况,开始怀疑摄像头驱动这块。由于设备需要,所以之前做了open了/dev/video0之后不调用close,整个进程open一次,以提高摄像头启动速度。先测试恢复正常open,close的情况,问题依旧存在。

        3,由于通话之后只建立了发送,接收,编码3个线程,再依次排查后依然无果,开始再次在网上搜索linux内存泄露可能出现的原因,也学到了不少。

参考博客 http://blog.chinaunix.net/uid-9543173-id-3571436.html ,尝试了手动释放cache内存 echo 3 > /proc/sys/vm/drop_caches ,free的内存确实增加了,但是线程的 %MEM依然不变。

参考博客 http://blog.chinaunix.net/uid-27164517-id-3318310.html ,最终发现原来刚好通话的这三个线程创建之后没有得到释放,增加属性配置为自动释放,再测试,终于线程内存不在增加,问题得到解决,修改代码如下:

原本代码:

pthread_create(&Encode_pthread,NULL,encodeThreadExecute,this);

修改代码如下:

pthread_attr_init(&threadAttr1);                                     
pthread_attr_setdetachstate(&threadAttr1,PTHREAD_CREATE_DETACHED);  
pthread_create(&Encode_pthread,&threadAttr1,encodeThreadExecute,this);


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值