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

Author:DriverMonkey

Mail:[email protected]

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

时间: 2024-08-02 11:49:40

记一次内存泄露调试(memory leak)-Driver Monkey的相关文章

android 内存泄露调试

一.概述 1 二.Android(Java)中常见的容易引起内存泄漏的不良代码 1 (一) 查询数据库没有关闭游标 2 (二) 构造Adapter时,没有使用缓存的 convertView 3 (三) Bitmap对象不在使用时调用recycle()释放内存 4 (四) 释放对象的引用 4 (五) 其他 5 三.内存监测工具 DDMS --> Heap 5 四.内存分析工具 MAT(Memory Analyzer Tool) 7 (一) 生成.hprof文件 7 (二) 使用MAT导入.hpro

android内存泄露调试,Heap,MAT

三.内存监测工具 DDMS --> Heap 无论怎么小心,想完全避免bad code是不可能的,此时就需要一些工具来帮助我们检查代码中是否存在会造成内存泄漏的地方.Android tools中的DDMS就带有一个很不错的内存监测工具Heap(这里我使用eclipse的ADT插件,并以真机为例,在模拟器中的情况类似).用Heap监测应用进程使用内存情况的步骤如下: 1. 启动eclipse后,切换到DDMS透视图,并确认Devices视图.Heap视图都是打开的: 2. 将手机通过USB链接至电

内存泄漏(memory leak)和内存溢出

1. 什么是内存泄漏(memory leak)? 指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况.内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费. 2. 两种类型的内存泄漏: 堆内存泄漏(Heap leak).对内存指的是程序运行中根据需要分配通过malloc,realloc new等从堆中分配的一块内存,再是完成后必须通过调用对应的 free或者delete 删掉.如果程序的设计的错误导致这部分内存没有被释放,

转:Android开发:使用DDMS Heap进行内存泄露调试

无论怎么小心,想完全避免bad code是不可能的,此时就需要一些工具来帮助我们检查代码中是否存在会造成内存泄漏的地方.Android tools中的DDMS就带有一个很不错的内存监测工具Heap,本文讲解了如何使用Heap来进行内存监测. 内存监测工具 DDMS --> Heap 这里我使用eclipse的ADT插件,并以真机为例,在模拟器中的情况类似.用 Heap监测应用进程使用内存情况的步骤如下: 1. 启动eclipse后,切换到DDMS透视图,并确认Devices视图.Heap视图都是

Android内存泄露调试

版权声明:本文为博主原创文章,未经博主允许不得转载. 版权声明:本文为兄弟连原创文章,未经博主允许不得转载. Android 内存泄漏调试 一.概述 如果我们编写的代码当中有太多的对内存使用不当的地方,难免会使得我们的设备运行缓慢,甚至是死机.为了能够使得 Android 应用程序安全且快速的运行, Android 的每个应用程序都会使用一个专有的 Dalvik 虚拟机实例来运行,即每个应用程序都是在属于自己的进程中运行的.一方面,如果程序在运行过程中出现了内存泄漏的问题,仅仅会使得自己的 进程

Android 内存优化 (防Memory Leak)

在之前的 Android 内存管理 &Memory Leak & OOM 分析 中,说到了Android的内存管理相关的原理,也能了解到Android Memory Leak 和 OOM为什么会发生.这次主要说说编码层面,如何来预防Memory Leak的发生. 对象都是有生命周期的,对象的生命周期有的是进程级别的,有的是Activity所在的生命周期,随Activity消亡:有的是Service所在的生命周期,随Service消亡.很多情况下判断对象是否合理存在的一个很重要的理由就是它实

记一次内存泄露排查

最后在实现一个无限循环的ViewPager,展示图片,功能实现了,但是运行一段时间之后会挂掉. 多亏了AndroidStudio的Memory Monitor,发现了内存一直在增长. 怎么触发gc内存都不会减少,确定了内存泄露了,但是不知哪里出问题了. 一时想到的排查内存泄露的工具,就是MAT了,但是没找到AndroidStudio的MAT插件. 只能先把java heap dump出来先,如下图所示 dump出来之后,hprof文件会保存在项目下captures目录,之前一直不知到,找了很久.

记一次内存泄露优化过程

背景 项目目前存在使用久了或者重复打开关闭某个页面,内存会一直飙升,居高不下,频繁发生GC.静置一段时间后,情况有所改善,但是问题依旧明显,如图1-1.1-2. 图1-1.操作时的内存使用情况 图1-2.静置时的内存使用情况 如上图1-1,是通过Android Studio查看内存(灰色)和CPU(红色)使用情况,可以看出内存有发生抖动并且是处于比较高的状态,再者,从logcat可以看到一直发生GC,如下图1-3: 图1-3. 出现这些情况,是有很多因素造成的,最主要的原因是发生了内存泄露:页面

内存泄漏(Memory Leak)

是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果. 常见的 Javascript 内存泄露 1: 意外的全局变量         可以在你的 JavaScript 文件开头添加 'use strict' 2: 被遗漏的定时器和回调函数   jQuery 这样的框架和库 它们在内部就已经处理了这些事情,并且保证不会产生内存泄露 3: DOM 之外的引用    不用的时候需要将所有的引用清除. 4: 闭包 慎用闭包 原文地址