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


    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。系统基本不用动态申请内存。没有内存泄露调试经验

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



  • 相关阅读:
    MySQL分区性能初探
    FastDFS开源的轻量级分布式文件系统
    MySQL数据类型之数值类型,对理解类型定义中的“位”有莫大的帮助
    空密码引发共享打印机拒绝访问
    利用Myxls导出并下载Excel
    StyleCop SA0102
    Spring AOP介绍
    大学英语一下重修听力考试范围.doc 听力原文 及MP3
    Eclipse中文版
    飞鱼秀下载
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5115440.html
Copyright © 2020-2023  润新知