📑往期推文全新看点(文中附带最新·鸿蒙全栈学习笔记)

✒️ 鸿蒙应用开发与鸿蒙系统开发哪个更有前景?

✒️ 嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~

✒️ 对于大前端开发来说,转鸿蒙开发究竟是福还是祸?

✒️ 鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?

✒️ 记录一场鸿蒙开发岗位面试经历~

✒️ 持续更新中……


资源泄漏是指句柄/线程/内存等资源超过系统设定上限,部分资源甚至失去了管控能力,此时系统可能出现卡死/重启等异常情况。LeakDetector模块提供资源泄漏检测、判决、维测日志抓取、日志上报的能力,为开发者提供详细的维测日志以辅助故障定位。

本文将分别介绍资源泄漏检测能力、泄漏问题定位分析思路。

日志获取

泄漏日志获取

资源泄漏日志由LeakDetector模块进行管理,可通过以下方式获取:

方式一:通过DevEco Testing进行稳定性测试获取日志

DevEco Testing工具会收集设备/data/log/resource_leak/路径下的资源泄漏故障日志,根据进程名、故障和时间分类显示。

注意:系统自动抓的调用栈(memleak-native-[process_name]-[pid]-[timestamp].txt)无法直接在DevEco Studio打开,需要修改后缀名为.nas,然后用最新版本的DevEco Studio打开。

方式二:通过DevEco Studio主动采集日志

DevEco Studio的profiler模块提供Allocation(获取native调用栈profiler)和 Snapshot(获取JS层heapdump)两种采集方式:

方式三:通过hiAppEvent接口订阅

hiAppEvent对外提供了故障订阅接口,可以订阅各类故障打点,详见HiAppEvent介绍,其中资源泄漏的订阅方式详见资源泄漏事件订阅方式介绍。

资源泄漏故障日志存于/data/storage/el2/log/resourcelimit/路径,日志名统一为RESOURCE_OVERLIMIT_[TIMESTAMP]_[PID].log,可根据日志内容区分文件类型。

说明
对获取的日志进行分析详见日志规格。

使用profiler解析内存泄漏日志

  • 栈信息日志文件:memleak-native-[process_name]-[pid]-[timestamp].txt

检测到泄漏后抓取的15min 进程内存trace,可将日志如下图通过Open File加载到 DevEco Studio profiler解析。

注意:系统自动抓的调用栈(memleak-native-[process_name]-[pid]-[timestamp].txt)无法直接在DevEco Studio打开,需要修改后缀名为.nas。在不同操作系统中,修改文件后缀名(文件扩展名)的方式存在差异,具体请参考相应操作系统的操作指导。

All Heap:框选后展示抓取内存的15分钟内的内存情况,记录了hook malloc等系统调用的堆栈。

Native日志是以so+偏移的形式展示调用栈(每一行表示一次内存分配行为调用栈),需要结合符号表进一步分析。点击Call Trees可以看到抓取进程的调用栈,筛选“Created & Existing”,根据没有释放的内存占比排序,展开可查看详细进程调用信息,优先排查内存占用较高的堆栈。

说明
部分栈单看Existing可能感觉泄漏不大,但是这只是抓取的15分钟内的堆栈信息和内存申请,进程泄漏是以几十甚至百小时为单位的,长时间的泄漏造成上报时的泄漏大小。

All Anonymous VM:框选后记录了当前hook mmap系统调用的堆栈信息。

同样选择Created & Existing,表示在hook抓取内存申请未释放的。长度越长代表在剩余内存中占用越多,优先排查。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐