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)相关推荐

  1. android native堆内存泄露,Android Native内存泄露检测

    Android Studio没有提供直接的Native层的内存泄露检测工具,但我们仍可以通过开源工具进行动态检测和静态检测 动态检测 在APP运行时进行检测,就像LeakCanary Update: ...

  2. Android NDK 内存泄露检测

    前言 最近写C++代码,老是担心代码存在内存泄露,胆战心惊的,Andorid中Java层代码内存泄露可以借助leakcanary进行检测:找了一番,找到了PC上C++上的内存泄露检测库LeakTrac ...

  3. 使用DDMS中的native heap 检查Android native 内存泄露

    一. 手机端准备工作 1. 安装库文件 所有的  native  内存分配函数  ( malloc ,  calloc , etc.)  都在  Android 的 libc   库中.为了跟踪堆内存 ...

  4. Android C++ Native 内存泄露检查工具Raphael使用介绍

    Android C++ Native 内存泄露检查工具使用介绍 实现原理 使用方法 Raphael添加到测试apk 添加项目依赖 同步gradle 启动泄露检测功能 直接使用boardcast功能控制 ...

  5. 【Android】内存泄露 使用 LeakCanary 应当如何应对?最全的解决

    目录 1.LeakCanary简介 2.入手指南 3.基础使用 3.1介绍 3.1.1什么是内存泄漏 3.1.2内存泄漏的常见原因 3.1.3为什么我应该使用LeakCanary 3.2.LeakCa ...

  6. DevPartner Studio Professional Edition 11 内存泄露检测使用

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! DevP ...

  7. 转载浅谈MFC内存泄露检测及内存越界访问保护机制

    2019独角兽企业重金招聘Python工程师标准>>> 本文所有代码均在VC2008下编译.调试.如果您使用的编译器不同,结果可能会有差别,但本文讲述的原理对于大部分编译器应该是相似 ...

  8. arm linux下交叉编译valgrind工具进行内存泄露检测和性能分析

    C/C++等底层语言在提供强大功能及性能的同时,其灵活的内存访问也带来了各种纠结的问题.如果crash的地方正是内存使用错误的地方,说明你人品好.如果crash的地方内存明显不是consistent的 ...

  9. Netty源码解析-Netty内存泄露检测

    前言: 在前一篇文章中,我们介绍了ByteBuf的引用计数器的使用,基本所有的ByteBuf都有相关计数的功能,那么这个计数有什么用呢. 实际主要就是做内存泄露检测用的.本文就其如何做检测来进行说明. ...

  10. Ubuntu下内存泄露检测工具Valgrind的使用

    在VS中可以用VLD检测是否有内存泄露,可以参考http://blog.csdn.net/fengbingchun/article/details/44195959,下面介绍下Ubuntu中内存泄露检 ...

最新文章

  1. RDKit | 基于RDKit描述三维分子形状(3D描述符)
  2. HTML DOM appendChild() 方法
  3. ZOJ Problem Set - 1730 Crazy Tea Party
  4. [Unity][NodeCanvas] 点击场景中的游戏对象以观察行为树运行情况
  5. 编辑器Ultraedit快捷键
  6. r roc函数_如何处理R(pROC包)中的多类ROC分析?
  7. 精准 iOS 内存泄露检测工具
  8. 基于分割和识别的服饰商品的自动推荐
  9. linux运维零基础学习,没有基础怎么学习Linux运维?Linux学习
  10. 下载论文的技巧及经验
  11. python win32转pdf 横版_.doc使用python转换为pdf
  12. 知识付费网站源码可开分站一键更新后台数据
  13. 双鱼林php学生信息管理系统,双鱼林基于ThinkPHP5图书管理系统demo v1.0
  14. 什么是真正的架构设计?十年Java经验让我总结出了这些,不愧是我
  15. 客服整理的聊天话术怎么导入到新电脑上面?
  16. 深入理解pytorch分布式并行处理工具DDP——从工程实战中的bug说起
  17. Oracle性能调优之/*+parallel(t,8)*/
  18. 9 个非常实用的网络调试命令
  19. 长沙理工大学第十二届ACM大赛-重现赛 L - 选择困难症
  20. 设计模式(Java随笔)—生成器模式

热门文章

  1. Mono产品生命周期
  2. 交易平台谁能在移动支付的大潮中成为赢家?
  3. webbrowser在vb中叫
  4. 使用C语言进行面向对象的开发--GObject入门[4]
  5. 用网页做触摸屏展示的设计要点
  6. redis采用序列化方案存对象
  7. 网站漏洞渗透检测过程与修复方案
  8. AnyForWeb告诉你什么才是“最好的”编程语言
  9. android fragment 跳到另一个fragment
  10. eclipse、MyEclipse实现批量改动文件编码