Android Native内存泄露检测(针对Android7.0)
1. 需要合入一个
Patch
2. 执行指令
adb root
adb shell setprop libc.debug.malloc.program cameraserver
adb shell setprop libc.debug.malloc.options “backtrace_enable_on_signal leak_track”
adb shell ps | find /I “cameraserver”
adb shell kill -9 pid_of_cameraserver // restart cameraserver
adb shell ps | find /I “cameraserver”
adb shell kill -45 pid_of_cameraserver // begin capture
run use case
adb shell ps | find /I “cameraserver” // need be same as last one, otherwise cameraserver die
during test
adb shell kill -28 pid_of_cameraserver // sigwinch will dump the callstack has memory leak
3. kill -28的指令是可以重复执行的。
4. 先看一个测试DEMO
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<termios.h>#include<string.h>char *mm = NULL; int main(void)
{int cnt = 0;do{mm = (char *)malloc(4096);memset(mm,0x0,4096);usleep(1*1000*1000);printf("leak count = %d\n",cnt++);}while(1);return 0;
}
上文中的malloc会最终调用到 bionic/libc/malloc_debug/malloc_debug.cpp中的debug_malloc函数。demo中每次泄漏4K的内存,我们随后通过libc提供的feature定位到它。
4. 检测步骤
a) setprop libc.debug.malloc.program leak
设置需要跟踪的进程名称
b) setprop libc.debug.malloc.options "backtrace_enable_on_signal leak_track"
设置跟踪进程的内存泄漏项检测
c) kill -9 杀掉该进程,同时重新启动这个进程,以使得该进程之后的内存分配,带有debug选项d) kill -45 进程ID,发送信号到目标进程,启动内存泄漏检测e) kill -28 进程ID,发送信号到目标进程,打印可疑的内存泄漏项
内存泄漏Log如下:
11-06 02:44:01.317 3565 3565 E malloc_debug: leak: Run: 'kill -45 3565' to enable backtracing.
11-06 02:44:01.318 3565 3565 E malloc_debug: leak: Run: 'kill -28 <pid of process>' to print memory leak information.
11-06 02:44:25.699 3565 3565 E malloc_debug: leak:3565 backtrace enabled.
11-06 02:44:33.851 3565 3582 E malloc_debug: PrintLeaks::leak:3565 backtrace printing. Thread = PrintLeaks Thread
11-06 02:44:33.852 3565 3582 E malloc_debug: +++ leak leaked memory dumping started +++
11-06 02:44:33.852 3565 3582 E malloc_debug: +++ total size: 40 K, total records: 1, top records: 1 +++
11-06 02:44:33.852 3565 3582 E malloc_debug: +++ Backtrace at time of allocation: total size 40960 (leak times: 10, avg size: 4096) +++
//这个时间点总共泄漏了40K,每次泄漏4K,持续了10次泄漏
11-06 02:44:33.852 3565 3582 E malloc_debug: #00 pc 0000000000000764 /system/bin/leak
11-06 02:44:33.852 3565 3582 E malloc_debug: #01 pc 000000000001a7d8 /system/lib64/libc.so (__libc_init+88)
11-06 02:44:33.852 3565 3582 E malloc_debug: #02 pc 0000000000000690 /system/bin/leak
11-06 02:44:33.853 3565 3582 E malloc_debug: +++ leak leaked memory dumping ended +++
11-06 02:44:42.341 3565 3587 E malloc_debug: PrintLeaks::leak:3565 backtrace printing. Thread = PrintLeaks Thread
11-06 02:44:42.342 3565 3587 E malloc_debug: +++ leak leaked memory dumping started +++
11-06 02:44:42.342 3565 3587 E malloc_debug: +++ total size: 76 K, total records: 1, top records: 1 +++
11-06 02:44:42.342 3565 3587 E malloc_debug: +++ Backtrace at time of allocation: total size 77824 (leak times: 19, avg size: 4096) +++
11-06 02:44:42.343 3565 3587 E malloc_debug: #00 pc 0000000000000764 /system/bin/leak
11-06 02:44:42.343 3565 3587 E malloc_debug: #01 pc 000000000001a7d8 /system/lib64/libc.so (__libc_init+88)
11-06 02:44:42.343 3565 3587 E malloc_debug: #02 pc 0000000000000690 /system/bin/leak
11-06 02:44:42.343 3565 3587 E malloc_debug: +++ leak leaked memory dumping ended +++
11-06 02:45:04.320 3565 3601 E malloc_debug: PrintLeaks::leak:3565 backtrace printing. Thread = PrintLeaks Thread
11-06 02:45:04.321 3565 3601 E malloc_debug: +++ leak leaked memory dumping started +++
11-06 02:45:04.321 3565 3601 E malloc_debug: +++ total size: 164 K, total records: 1, top records: 1 +++
11-06 02:45:04.321 3565 3601 E malloc_debug: +++ Backtrace at time of allocation: total size 167936 (leak times: 41, avg size: 4096) +++
5. 定位内存泄漏的位置
#gdb leak(gdb) b *0x0000000000000764Breakpoint 1 at 0x764: file hardware/rockchip/memleak/leak.cpp, line 27.
需要特别留意的是这里的可执行文件leak必须包含符号表(symbol目录下),经过定位后,泄漏点在leak.cpp的第27行,结合之前的DEMO代码,确认正是此处泄漏。
Android Native内存泄露检测(针对Android7.0)相关推荐
- android native堆内存泄露,Android Native内存泄露检测
Android Studio没有提供直接的Native层的内存泄露检测工具,但我们仍可以通过开源工具进行动态检测和静态检测 动态检测 在APP运行时进行检测,就像LeakCanary Update: ...
- Android NDK 内存泄露检测
前言 最近写C++代码,老是担心代码存在内存泄露,胆战心惊的,Andorid中Java层代码内存泄露可以借助leakcanary进行检测:找了一番,找到了PC上C++上的内存泄露检测库LeakTrac ...
- 使用DDMS中的native heap 检查Android native 内存泄露
一. 手机端准备工作 1. 安装库文件 所有的 native 内存分配函数 ( malloc , calloc , etc.) 都在 Android 的 libc 库中.为了跟踪堆内存 ...
- Android C++ Native 内存泄露检查工具Raphael使用介绍
Android C++ Native 内存泄露检查工具使用介绍 实现原理 使用方法 Raphael添加到测试apk 添加项目依赖 同步gradle 启动泄露检测功能 直接使用boardcast功能控制 ...
- 【Android】内存泄露 使用 LeakCanary 应当如何应对?最全的解决
目录 1.LeakCanary简介 2.入手指南 3.基础使用 3.1介绍 3.1.1什么是内存泄漏 3.1.2内存泄漏的常见原因 3.1.3为什么我应该使用LeakCanary 3.2.LeakCa ...
- DevPartner Studio Professional Edition 11 内存泄露检测使用
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! DevP ...
- 转载浅谈MFC内存泄露检测及内存越界访问保护机制
2019独角兽企业重金招聘Python工程师标准>>> 本文所有代码均在VC2008下编译.调试.如果您使用的编译器不同,结果可能会有差别,但本文讲述的原理对于大部分编译器应该是相似 ...
- arm linux下交叉编译valgrind工具进行内存泄露检测和性能分析
C/C++等底层语言在提供强大功能及性能的同时,其灵活的内存访问也带来了各种纠结的问题.如果crash的地方正是内存使用错误的地方,说明你人品好.如果crash的地方内存明显不是consistent的 ...
- Netty源码解析-Netty内存泄露检测
前言: 在前一篇文章中,我们介绍了ByteBuf的引用计数器的使用,基本所有的ByteBuf都有相关计数的功能,那么这个计数有什么用呢. 实际主要就是做内存泄露检测用的.本文就其如何做检测来进行说明. ...
- Ubuntu下内存泄露检测工具Valgrind的使用
在VS中可以用VLD检测是否有内存泄露,可以参考http://blog.csdn.net/fengbingchun/article/details/44195959,下面介绍下Ubuntu中内存泄露检 ...
最新文章
- RDKit | 基于RDKit描述三维分子形状(3D描述符)
- HTML DOM appendChild() 方法
- ZOJ Problem Set - 1730 Crazy Tea Party
- [Unity][NodeCanvas] 点击场景中的游戏对象以观察行为树运行情况
- 编辑器Ultraedit快捷键
- r roc函数_如何处理R(pROC包)中的多类ROC分析?
- 精准 iOS 内存泄露检测工具
- 基于分割和识别的服饰商品的自动推荐
- linux运维零基础学习,没有基础怎么学习Linux运维?Linux学习
- 下载论文的技巧及经验
- python win32转pdf 横版_.doc使用python转换为pdf
- 知识付费网站源码可开分站一键更新后台数据
- 双鱼林php学生信息管理系统,双鱼林基于ThinkPHP5图书管理系统demo v1.0
- 什么是真正的架构设计?十年Java经验让我总结出了这些,不愧是我
- 客服整理的聊天话术怎么导入到新电脑上面?
- 深入理解pytorch分布式并行处理工具DDP——从工程实战中的bug说起
- Oracle性能调优之/*+parallel(t,8)*/
- 9 个非常实用的网络调试命令
- 长沙理工大学第十二届ACM大赛-重现赛 L - 选择困难症
- 设计模式(Java随笔)—生成器模式