码迷,mamicode.com
首页 > 其他好文 > 详细

记一次内存泄露调试(memory leak)-Driver Monkey

时间:2014-07-22 23:01:53      阅读:384      评论:0      收藏:0      [点我收藏+]

标签:style   color   使用   width   for   问题   

Author:DriverMonkey

Mail:bookworepeng@Hotmail.com

Phone:13410905075

QQ:196568501


硬件环境:AM335X

软件环境:linux 3.2 


现象:1)系统运行一晚上,配置硬件操作失效

           2)系统放置在那,没有用户输入会自己死机


调试过程:

第一步:分析硬件配置失效原因,怀疑配置硬件代码有问题

                最后发现 代码 调用 system() 函数配置硬件没有调用成功 返回值 为 -1.

第二步: 继续上一步 分析 system() 在什么情况下会返回 -1,

               查看system 源代码,得出结论 system() 函数会调用 fork() 函数 只有fork() 函数失败的时候会返回 -1

第三步:进一步分析 fork() 调用失败的原因, fork() 绝大部分情况在申请不到足够内存时候会失败

              到了这一步开始怀疑内存泄露引起的问题

第四步:验证内存泄露问题

             1)运行应用程序,使程序负荷加到最大,用 free 查看内存使用情况

                  发现内存在以 5kb/s 的速度减少(到这一步可以完全确认是内存泄露)

             2) 进一步验证发现系统内存只剩下 8kb 左右系统会非常卡。

                   最后内核会打印系统内存不足错误。

                   同时也有一定概率出现system() 函数调用失败情况

第五步:调试代码超出内存泄露代码              

              1)怀疑是 malloc() 后没有 free() 引起的 Leak

                    验证:在所有的malloc() 和 free()上包一层  并分别分配一个计数器,

                                发现计数器并没有随时间推移而增加,排除是malloc 和free 的问题。

              2)怀疑系统中用的 c++ map  string  这些全局对象有问

                    分别打印这些对象的 size() 发现size 也没有增加

                    到这一步调试有点陷入僵局,最后去了一趟茅厕,灵光一现是不是用的开源库,用法不对引起的泄露问题

              3)验证第二步的怀疑。整个系统跑的最多的就是XML库

                    去掉xml 发现内存没有再减少。

                    定位出XML库的使用问题,重新再逐条过一遍使用的API发现获取content的xml API 需要调用XMLfree 来手动释放。

                     

总结:

           由于以前都是在嵌入平台开发,跑的到时单片机,dsp,系统基本不用动态申请内存,没有内存泄露调试经验

           定位这个问题还是花了基本一天的时间。实际上每次问题的出现都是一个很好的学习机会



记一次内存泄露调试(memory leak)-Driver Monkey,码迷,mamicode.com

记一次内存泄露调试(memory leak)-Driver Monkey

标签:style   color   使用   width   for   问题   

原文地址:http://blog.csdn.net/drivermonkey/article/details/24816243

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!