内存泄露检测
使用场景
业务运行中发生内存泄露,业务逻辑复杂或者长时间运行才出现。
功能说明
申请内存和释放申请时,在内存节点控制头中记录函数调用栈,发生内存泄露时,通过分析used节点信息,可定位疑似内存泄露的位置。
使用方法
- 通过make menuconfig打开内存泄漏检测。
- 目前只有bestfit内存管理算法支持该功能,需要使能LOSCFG_KERNEL_MEM_BESTFIT。
Kernel ---> Memory Management ---> Dynamic Memory Management Algorithm ---> bestfit
- 同时该功能依赖于LOSCFG_MEM_LEAKCHECK,可以在菜单项中选择“Enable Function call stack of Mem operation recorded”开启该宏开关:
Debug ---> Enable a Debug Version ---> Enable MEM Debug ---> Enable Function call stack of Mem operation recorded
- 目前只有bestfit内存管理算法支持该功能,需要使能LOSCFG_KERNEL_MEM_BESTFIT。
- 配置调用栈回溯信息。
- LOS_OMIT_LR_CNT:调用栈回溯忽略层级,默认配置为2。
- LOS_RECORD_LR_CNT:调用栈回溯记录个数,默认配置为3。
默认配置下,获取0~4层LR信息,忽略0和1两层(调用封装接口的节点0层和1层LR信息相同),记录2、3、4三层。
宏配置LOS_OMIT_LR_CNT 和LOS_RECORD_LR_CNT位于los_memory.h中。
- 使用Shell命令 memused 获取used节点数据。
系统稳定运行后,若used节点个数随时间一直增加,极大可能存在内存泄露,对数据进行对比分析,重点关注LR重复的节点是否存在内存泄露,泄漏点可通过LR信息进行回溯查找。
打印log信息如下,memused命令说明详见memused:
Huawei LiteOS # memused node LR[0] LR[1] LR[2] 0x802d7b34: 0x8006d86c 0x8011c604 0x8011c758 0x802dab6c: 0x8006d16c 0x8006d8a0 0x8011c604
注意事项
该功能开启时会增加系统内存占用(内存占用=节点个数*LOS_RECORD_LR_CNT*指针大小),影响内存操作性能,建议仅在定位问题时开启,默认关闭。