[教程] Android Native内存泄漏检测方法
转载请注明出处:https://www.cnblogs.com/zzcperf/p/9563389.html
Android 检测 C/C++内存泄漏的方法越来越简便了,下面列举一下不同场景下检测C/C++内存泄漏的方法。
在介绍检查方法之前,先把一个技巧说在前头。因为打开检测开关,会严重影响手机性能,所以最好使用32位手机来检测,32位手机会顺畅一点。
Android 7.x / 8.x(针对root设备,调试安卓APP)
1. 准备一个userdebug或eng版本手机,尽量选择32bit机器,64bit设备会非常卡,libc_malloc_debug.so需要编译进去,下载native_heapdump_viewer.py脚本备用
2. 打开debug开关。
1)如果是Android 8.x,执行以下命令
adb shell setprop wrap.<APP_PACKAGE_NAME> '"LIBC_DEBUG_MALLOC_OPTIONS=backtrace"'
adb shell am force-stop <APP_PACKAGE_NAME>
2)如果是Android 7.x (8.x 也可以用),执行以下命令,其中app_process照写,不需要针对调试的app更改
adb root
adb shell stop
adb shell setprop lib.debug.malloc.program app_process
adb shell setprop lib.debug.malloc.options "\"backtrace leak_track\""
adb shell start
3. 执行重现路径N次
4. 执行以下命令,其中/path/to/symbols/是指存放带有符号信息so文件的文件夹,默认是$ANDROID_PRODUCT_OUT/symbols。
adb shell am dumpheap -n <PID_TO_DUMP> /data/local/tmp/heap.txt adb pull /data/local/tmp/heap.txt python development/scripts/native_heapdump_viewer.py --html --symbols /path/to/symbols/ heap.txt > heap_info.html
5. 不重启手机,继续重复第三、第四步,即再重现N次,抓出累计重现了2N次的log,最后对比两次生成的heap_info.html
Android 5.x - 7.x(针对root设备,调试Native进程)
Google的调试方法可以参考这里,Google的方法在不断完善中,遇到问题或需要更灵活的调试方法时,可以使用下面的库。
ChkMemLeak库只有一个函数checkLeak,每次调用该函数,都输出当前进程尚未释放的内存。
对比多次输出结果,排查可疑的内存泄漏。
1. 将ChkMemLeak库添加到系统代码中。
2. 在需要调试的代码中包含头文件,调用checkLeak();在Android.mk(或.bp)动态库libcheckleak。
注意不要在线程的死循环中调用,否则会导致性能问题。
3. 打开debug开关
如果是Android 7.x / 8.x,执行以下命令
adb root
adb shell stop
adb shell setprop lib.debug.malloc.program 进程名
adb shell setprop lib.debug.malloc.options "\"backtrace leak_track\""
adb shell start
如果是Android 5.x / 6.x,执行以下命令
adb root
adb shell setprop libc.debug.malloc=1
adb shell stop
adb shell start
4. 执行调用checkLeak()的操作路径,每调用一次,都会在 /data 目录生成 checkleak_PID_timestamp.csv
size, duplications, backtrace三列分别是单次分配大小、分配次数,调用栈
找到可疑的分配路径后,使用addr2line工具找到对应的代码位置。
Android 4.x或之前版本(针对root设备,调试Native进程)
这么老的OS应该很少用了,解析调用栈的头文件是/android/system/core/include/corkscrew/backtrace.h
有需要的同学可以参照ChkMemLeak实现一下。
[教程] Android Native内存泄漏检测方法的更多相关文章
- [原理] Android Native内存泄漏检测原理解析
转载请注明出处:https://www.cnblogs.com/zzcperf/articles/11615655.html 上一篇文章列举了不同版本Android OS内存泄漏的检测操作(传送门), ...
- 利用Android Studio、MAT对Android进行内存泄漏检测
利用Android Studio.MAT对Android进行内存泄漏检测 Android开发中难免会遇到各种内存泄漏,如果不及时发现处理,会导致出现内存越用越大,可能会因为内存泄漏导致出现各种奇怪的c ...
- VS2005内存泄漏检测方法[转载]
一.非MFC程序可以用以下方法检测内存泄露: 1. 程序开始包含如下定义: #ifdef _DEBUG #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __ ...
- Android Native 内存泄漏系统化解决方案
导读:C++内存泄漏问题的分析.定位一直是Android平台上困扰开发人员的难题.因为地图渲染.导航等核心功能对性能要求很高,高德地图APP中存在大量的C++代码.解决这个问题对于产品质量尤为重要和关 ...
- C++程序内存泄漏检测方法
一.前言 在Linux平台上有valgrind可以非常方便的帮助我们定位内存泄漏,因为Linux在开发领域的使用场景大多是跑服务器,再加上它的开源属性,相对而言,处理问题容易形成“统一”的标准.而在W ...
- 【转】简单内存泄漏检测方法 解决 Detected memory leaks! 问题
我的环境是: XP SP2 . VS2003 最近在一个项目中,程序退出后都出现内存泄漏: Detected memory leaks! Dumping objects -> {98500} n ...
- _CrtSetBreakAlloc简单内存泄漏检测方法,解决Detected memory leaks!问题
我的环境是: XP SP2 . VS2003 最近在一个项目中,程序退出后都出现内存泄漏: Detected memory leaks! Dumping objects -> {98500} n ...
- Windows 下的内存泄漏检测方法
在 Windows 下,可使用 Visual C++ 的 C Runtime Library(CRT) 检测内存泄漏. 首先,我们在.c或.cpp 文件首行插入这一段代码: #define _CRTD ...
- 【Visual Studio】简单内存泄漏检测方法 解决 Detected memory leaks! 问题(转)
原文转自 http://blog.csdn.net/u011430225/article/details/47840647 我的环境是: XP SP2.VS2003 最近在一个项目中, 程序退出后都出 ...
随机推荐
- 4G工业路由器的信号强度应该怎么保证呢?
在M2M无线方面,最薄弱的环节是差的间歇性的信号强度.低信号电平导致系统性能差,响应时间慢和可靠性问题.对于系统安装人员和其他4G工业路由器供应商,如何确保最佳的蜂窝信号强度? 检查2G/3G/4G信 ...
- Django之富文本(获取内容,设置内容)
富文本 1.Rich Text Format(RTF) 微软开发的跨平台文档格式,大多数的文字处理软件都能读取和保存RTF文档,其实就是可以添加样式的文档,和HTML有很多相似的地方 图示 2.tin ...
- twoSum问题的核心思想
Two Sum 系列问题在 LeetCode 上有好几道,这篇文章就挑出有代表性的几道,介绍一下这种问题怎么解决. TwoSum I 这个问题的最基本形式是这样:给你一个数组和一个整数 target, ...
- SpringCloud gateway 过滤
如果需要获取一张图片但服务器没有过滤图片请求地址时,每次请求图片都需要携带token等安全验证密钥,可到nacos配置网关(gateway)的security配置,可过滤掉你配置的url(可理解为白名 ...
- 聊聊Go代码覆盖率技术与最佳实践
"聊点干货" 覆盖率技术基础 截止到Go1.15.2以前,关于覆盖率技术底层实现,以下知识点您应该知道: go语言采用的是插桩源码的形式,而不是待二进制执行时再去设置breakpo ...
- 02_tcp_deadlock
# 这个程序我们是测试客户端和服务端在进行通信的过程中,可能会产生死锁的情况. # 这是因为缓冲区,和TCP协议的可靠性连接导致的. # 在程序中我们可以看到,客户端先向服务端发送数据,然后服务端就收 ...
- VSCode--HTML代码片段(基础版,react、vue、jquery)
起因是最近在学习前端,看的网上的demo也是在react.vue.jquery之间穿插,为了方便一键生成html模板(懒)写demo,有了以下折腾. 本人使用的前端编辑工具是vscode(方便.懒), ...
- GROUP BY 分组后得到最新即时间最大的一条数据(需添加limit才可生效)
当使用GROUP BY 分组,默认返回的数据是组中最小的记录即id最小的数据, 当开发中经常会需要分组后将最新的数据放在前面, 为了实现需求,使用了嵌套查询,分别使用order by来排序 SELEC ...
- delphi 设置默认控件得到焦点
如果同一窗体有多个按钮的话,追踪源码发现最后是taborder来的 如: 在空白窗体上拖入两个button (btn1,btn2) 如果在btn2设置default = True 运行后,默认焦点还是 ...
- 微信公众号Makrdown编辑器,语法你懂吗?
感谢 WeChat Format 源码: https://github.com/lyricat/wechat-format! 其他工具推荐: 微信公众号编辑器 Makrdown: https://md ...