记一次内存泄漏调试(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。系统基本不用动态申请内存。没有内存泄露调试经验
定位这个问题还是花了基本一天的时间。实际上每次问题的出现都是一个非常好的学习机会
记一次内存泄漏调试(memory leak)-Driver Monkey的更多相关文章
- 内存泄漏(Memory Leak)
内存泄露检测工具Valgrind 内存泄露简介 回到顶部 什么是内存泄漏 内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因,程序未释放或无法释放,造成系统内存的浪费,导致 ...
- OutOfMemoryError异常java内存泄漏(Memory Leak)和内存溢出(Memory Overflow)
本篇文章理解源自于<深入理解java虚拟机>2.4章节 实战:OutOfMemoryError异常 在以下例子中,所有代码都可以抛出OutOfMemoryError异常,但是要区分到底 ...
- 内存泄漏(memory leak)和内存溢出
1. 什么是内存泄漏(memory leak)? 指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况.内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存 ...
- Android 内存管理 &Memory Leak & OOM 分析
1.Android 流程管理&内存 Android主要应用在嵌入式设备其中.而嵌入式设备因为一些众所周知的条件限制,通常都不会有非常高的配置,特别是内存是比較有限的. 假设我们编写的代 码其中 ...
- java 基础知识学习 内存泄露(memory leak) VS 内存溢出(out of memory)以及内存管理
内存泄露(memory leak) VS 内存溢出(out of memory) 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory ...
- python 内存泄漏调试
Python应用程序内存泄漏的调试 Quake Lee quakelee@geekcn.org 新浪网技术(中国)有限公司 Sina Research & Development Python ...
- 【转】Android之内存泄漏调试学习与总结
大家有或经常碰到OOM的问题,对吧?很多这样的问题只要一出现相信大家的想法跟小马的一样,就是自己的应用:优化.优化.再优化!而且如果出现类似于OOM这样级别的问题,根本就不好处理,LogCat日志中显 ...
- Android 内存优化 (防Memory Leak)
在之前的 Android 内存管理 &Memory Leak & OOM 分析 中,说到了Android的内存管理相关的原理,也能了解到Android Memory Leak 和 ...
- AndroidStudio 内存泄漏分析 Memory Monitor
ok.写一段内存泄漏的code private TextView txt; @Override protected void onCreate(Bundle savedInstanceState) { ...
随机推荐
- 10.cocos2dx C++为Sprite添加触摸事件监听器
1.首先头文件定义事件处理的函数原型 private: bool onTouchBegan(Touch* tTouch,Event* eEvent);//手指按下事件 void onTouchMove ...
- HTML5多维度数据分析
详情:http://echarts.baidu.com/index.html
- ES6第三节:变量的解构赋值
ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构.下面我们看实际的例子: 一.数组解构: let [a,b,c] = [1,2,3]; console.log(a); //a ...
- linux 查找文件和文件夹与下载命令
查找命令: 查找根目录下查找文件夹名称叫dir的目录地址 find / -name dir -d 查找/var/www/目录下叫index.jsp的文件 find /var/www/ -name i ...
- Android基础新手教程——3.8 Gestures(手势)
Android基础新手教程--3.8 Gesture(手势) 标签(空格分隔): Android基础新手教程 本节引言: 周六不歇息,刚剪完了个大平头回来.继续码字~ 好的,本节给大家带来点的是第三章 ...
- onblur 对象失去焦点事件
onblur 对象失去焦点事件 一.总结 1.几乎所有的控件都支持onblur事件 二.简介 onblur 事件 Event 对象 定义和用法 onblur 事件会在对象失去焦点时发生. 语法 onb ...
- javascript类型系统之基本数据类型与包装类型
javascript的数据类型可以分为两种:原始类型和引用类型 原始类型也称为基本类型或简单类型,因为其占据空间固定,是简单的数据段,为了便于提升变量查询速度,将其存储在栈(stack)中(按值访问) ...
- HTML5的设计目的是为了在移动设备上支持多媒体
HTML5的设计目的是为了在移动设备上支持多媒体
- JavaScript 实现表格单列按字母排序
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> ...
- Android学习笔记之Bitmap位图的缩放
位图的缩放也可以借助Matrix或者Canvas来实现. 通过postScale(0.5f, 0.3f)方法设置旋转角度,然后用createBitmap方法创建一个经过缩放处理的Bitmap对象,最后 ...