记一次内存泄漏调试(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) { ...
随机推荐
- 缓存函数memorize
function mulity(x){ return x*x; } function memorize(f){ var cache = {}; var key = arguments.length + ...
- 【基础篇】点击Button按钮更换图片
我们在开发的过程中,往往为了美化界面的需要,会修改按钮的默认外观,而因为Android中的按钮有三种状态—默认,被点击,被选中.所以,如果要改变按钮的外观,需要对这三种情况都做出修改,也许在以往,我们 ...
- 原生JS实现页面内定位
需求:点击跳转到页面指定位置 <div id="test">点击跳转到此处</div> [法一]: 利用a标签的锚点跳转 <a href=" ...
- fc---输出历史命令列表
fc指令 fc指令可以用于输出历史命令列表,也可以通过调用vi编辑器对历史指令内容进行编辑输出. 语法: fc [-e ename] [-lnr] [first] [last] 选项: -l:显示历史 ...
- XML学习总结(1)——XML入门
一.XML语法学习 学习XML语法的目的就是编写XML 一个XML文件分为如下几部分内容: 文档声明 元素 属性 注释 CDATA区 .特殊字符 处理指令(processing instruction ...
- HDOJ 5357 Easy Sequence DP
a[i] 表示以i字符开头的合法序列有多少个 b[i] 表示以i字符结尾的合法序列有多少个 up表示上一层的'('的相应位置 mt[i] i匹配的相应位置 c[i] 包括i字符的合法序列个数 c[i ...
- 用 cctld工具创建带有国家代码的IP地址表
用 cctld工具创建带有国家代码的IP地址表 cctld tools is creating IP addresses table with Country Code 项目地址 https://gi ...
- while 循环的理解
if 与 while 的主要区别:if 只判断和执行一次,而 while 却代表着一个循环,执行多少次,要视情况而定: 两种情况(A.B)都会让循环体执行: while A or B: 两种情况(A. ...
- Objective-C基础笔记(1)基本概念和第一个程序
一.基本概念 Objective-C(简称OC)是iOS开发的核心语言,苹果公司在维护,在开发过程中也会配合着使用C语言.C++,OC主要负责UI界面,C语言.C++可用于图形处理.C语言是面向过程的 ...
- 使用JOTM实现分布式事务管理(多数据源)
使用spring和hibernate可以很方便的实现一个数据源的事务管理,但是如果需要同时对多个数据源进行事务控制,并且不想使用重量级容器提供的机制的话,可以使用JOTM达到目的. JOTM的配置十分 ...