博客> 使用 OOMDetector 检测app内存使用情况
使用 OOMDetector 检测app内存使用情况
2019-11-19 03:28 评论:0 阅读:933 lvhahaha
内存检测 OOMDetector

功能介绍

OOMDetector是手Q自研的IOS内存监控组件,腾讯内部目前已有多个App接入了OOMDetector,它主要有以下两个功能:

  • 爆内存堆栈统计:负责记录进程内存分配堆栈和内存块大小,在爆内存时Dump堆栈数据到磁盘

  • 内存泄漏检测:检测内存泄漏,目前支持Malloc内存块和OC对象的泄漏检测

OOMDetector可以快速帮助开发者发现和定位App爆内存问题和内存泄漏,组件目前已经在Github开源,源码地址: gitHub地址

关于OOMDetector检测内存原理看这里

这里只介绍关于OOMDetector 的生成的log检测。

使用代码 首先在自己的项目里pod进OOMDetector。

OOMDetector *detector = [OOMDetector getInstance];
[detector setupWithDefaultConfig];

下面的几项可以根据自己的实际需要选择性设置

// 设置捕获堆栈数据、内存log代理,在出现单次大块内存分配、检查到内存泄漏且时、调用uploadAllStack方法时会触发此回调
[detector setFileDataDelegate:[MyOOMDataManager getInstance]];

// 设置app内存触顶监控数据代理,在调用startMaxMemoryStatistic:开启内存触顶监控后会触发此回调,返回前一次app运行时单次生命周期内的最大物理内存数据
[detector setPerformanceDataDelegate:[MyOOMDataManager getInstance]];

// 单次大块内存分配监控
[detector startSingleChunkMallocDetector:50 * 1024 * 1024 callback:^(size_t bytes, NSString *stack) {
    [[NSNotificationCenter defaultCenter] postNotificationName:kChunkMallocNoti object:stack];
}];

// 开启内存泄漏监控,目前只可检测真机运行时的内存泄漏,模拟器暂不支持
[detector setupLeakChecker];

// 开启MallocStackMonitor用以监控通过malloc方式分配的内存
[detector startMallocStackMonitor:10 * 1024 * 1024 needAutoDumpWhenOverflow:YES dumpLimit:300 sampleInterval:0.1];

// 开启VMStackMonitor用以监控非直接通过malloc方式分配的内存
// 因为startVMStackMonitor:方法用到了私有API __syscall_logger会带来app store审核不通过的风险,此方法默认只在DEBUG模式下生效,如果
// 需要在RELEASE模式下也可用,请打开USE_VM_LOGGER_FORCEDLY宏,但是切记在提交appstore前将此宏关闭,否则可能会审核不通过
[detector startVMStackMonitor:10 * 1024 * 1024];

// 调用该接口上报所有缓存的OOM相关log给通过setFileDataDelegate:方法设置的代理,建议在启动的时候调用
[detector uploadAllStack];

MyOOMDataManager 需要自己创建一个新的类进行接受,详见demo。

运行工程,会出现这个图像。

 屏幕快照 2018-12-10 下午3.03.48.png

问题发现与解决

1.发现问题 如果发现了1个内存泄漏,但是给出的提示地址是真实的内存地址,需要转换,所以需要准备一下文件。

  • translate_oom.py(这个是堆栈的翻译文件,相当于工具文件)

  • xx.app.dSYM(这个是app编译好跟app同时生成的文件,是符号表路径)-- 上篇微博已经讲过怎么寻找

  • normal_malloc20180205_154255347.log 在Library/OOMDetector路径下的爆内存日志。取得此日志方法:在测试手机连接电脑的情况下。

寻找这个文件:注意这个文件需要内存暴涨情况下才会出现, git上关于这个文件的问题有关说法

在xcode的Window->Devices and Simulators,如下图,最后右键显示包内容,Library/OOMDetector路径下的爆内存日志)

 20180206110039908.png

2.解决问题

a 把上边这三个文件拉到一个文件夹下,终端到此文件夹下。

 20180206110103798.png

b 得到的文件:normal_malloc20180205_154255347.log_translated.log

对比normal_malloc20180205_154255347.log和normal_malloc20180205_154255347.log_translated.log可以看到,normal_malloc20180205_154255347.log_translated.log是可以看到具体代码出错的地方

c 如果是内存泄漏,需要自己保存内存泄漏的提示信息(同样以log文件保存),然后打开translate_oom.py文件,定位到倒数第二行,translate(0,"stack:","Malloc_size:");将脚本里面参数改成 translate(0,"stack:","leak”),然后按照上面的方式再操作一遍即可。

收藏
2
sina weixin mail 回到顶部