更新时间:2021-07-08 GMT+08:00
分享

内存泄露检测

使用场景

业务运行中发生内存泄露,业务逻辑复杂或者长时间运行才出现。

功能说明

申请内存和释放申请时,在内存节点控制头中记录函数调用栈,发生内存泄露时,通过分析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三层。

    宏配置LOS_OMIT_LR_CNT 和LOS_RECORD_LR_CNT位于los_memory.h中。

  3. 使用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*指针大小),影响内存操作性能,建议仅在定位问题时开启,默认关闭。

相关文档