
# 内存泄露检测
#### 使用场景
业务运行中发生内存泄露，业务逻辑复杂或者长时间运行才出现。
#### 功能说明
申请内存和释放申请时，在内存节点控制头中记录函数调用栈，发生内存泄露时，通过分析used节点信息，可定位疑似内存泄露的位置。
#### 使用方法
1. 通过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
     ```
     
   
   
   
   
2. 配置调用栈回溯信息。 
   - LOS_OMIT_LR_CNT：调用栈回溯忽略层级，默认配置为2。
   
   - LOS_RECORD_LR_CNT：调用栈回溯记录个数，默认配置为3。
   
   
   默认配置下，获取0\~4层LR信息，忽略0和1两层（调用封装接口的节点0层和1层LR信息相同），记录2、3、4三层。
   ![](https://support.huaweicloud.com/maintenance-LiteOS/public_sys-resources/note_3.0-zh-cn.png)
   宏配置LOS_OMIT_LR_CNT 和LOS_RECORD_LR_CNT位于los_memory.h中。
   
   
3. 使用Shell命令**memused** 获取used节点数据。
   
   系统稳定运行后，若used节点个数随时间一直增加，极大可能存在内存泄露，对数据进行对比分析，重点关注LR重复的节点是否存在内存泄露，泄漏点可通过LR信息进行回溯查找。
   打印log信息如下，memused命令说明详见[memused](https://support.huaweicloud.com/maintenance-LiteOS/zh-cn_topic_0312409048.html#ZH-CN_TOPIC_0312409048)：
   ```
   Huawei LiteOS # memused
   node         LR[0]       LR[1]       LR[2]
   0x802d7b34:  0x8006d86c  0x8011c604  0x8011c758
   0x802dab6c:  0x8006d16c  0x8006d8a0  0x8011c604
   ```
   
   
 
#### 注意事项
该功能开启时会增加系统内存占用（内存占用=节点个数\*LOS_RECORD_LR_CNT\*指针大小），影响内存操作性能，建议仅在定位问题时开启，默认关闭。
