7.14. MALLOC

Overview 提供内存申请接口应用示例、常用相关 API 介绍和常见问题。

7.14.1. 应用示例

示例演示:

    1. 内存申请接口如何使用;

    1. 内存泄漏如何查找;

    1. 内存被篡改如何定位;

    1. 内存碎片解决方法;

example: 进入 apps/demo/demo_DevKitBoard/include/demo_config.h ,开启宏 USE_MALLOC_TEST_DEMO

7.14.2. 常见问题

  • 如何查看内存使用情况?

    答:

      1. ``app_config.h `` 增加 #define RTOS_STACK_CHECK_ENABLE 即可,打印周期默认为60秒,测试建议设置为3秒;

    • 2.malloc_stats(); //打印一下当前内存使用情况,简单来看也可以发现有没有内存泄漏,如下打印出来:

      DLMALLOC_STATS:

      total: 493488 //总共内存堆可使用的大小

      left: 435416 //当前剩余可使用的大小

  • 如何启动内存泄漏侦测?

    答:有两种方法查找内存泄漏,可以同时使用;

    • 方法1:定位一个功能模块内部有没有内存泄漏

      • 1.需要在 ``app_config.h `` 增加 #define MEM_LEAK_CHECK_ENABLE

        1. ``#include “system/mem_leak_test.h” ``//如果需要启动内存泄漏侦测, 必须所有需要侦测的.c和.h文件都要包含此头文件。

      • 3.例如打印: MALLOC LEAK DBG:malloc_test_task 20 rets:0x1c10660,size:0x1000

        代表发现malloc_test_task函数的第20行,rets地址为0x1c10660,申请大小为0x1000,rets可以通过工具 cpu/wl80/tools/定位异常地址.bat 查看

    • 方法2:需要使用mem_heap库来定位不断打印定位整个SDK申请内存的情况来分析,此方法mem_heap库才有,请联系FAE替换内存申请库用于debug

        1. app_config.h 需要增加 #define MEM_LEAK_CHECK_ENABLE

      • 2.malloc_dump(); //定时打印有没有内存泄漏的情况,

  • 内存使用导致死机的情况有哪些?

    答: 用户需要排查有没有错误使用内存申请的情况,例如:

    • 1.读写操作的地址范围超出内存申请指针包含的范围

    • 2.内存指针释放了还继续使用

    • 3.多次释放同一个内存申请的指针

  • 感觉到内存被篡改但是没有马上造成异常的情况应该如何定位?

    答: 需要使用mem_heap库来定位, 需要在流程上存在篡改可能性的地方加入mem_heap_check函数来分析,此方法mem_heap库才有,请联系FAE替换内存申请库用于debug

  • 有时候发现内存堆空间足够,但是内存申请失败的原因是什么?

    答: 由于内存碎片导致没有一块连续的并且足够大内存可以申请导致的, 用户使用内存申请注意不要申请过于小size的内存,另外常驻内存不要使用malloc,直接使用静态变量,malloc多个变量的情况考虑优化成一次性malloc一个结构体使用

  • 打印出来中文乱码?

    答: 更换打印软件,有可能是该打印软件的转码格式不支持。

7.14.3. API Reference

Functions

void *malloc(size_t size)
void *zalloc(size_t size)
void *calloc(size_t count, size_t size)
void *realloc(void *rmem, size_t newsize)
void free(void *mem)
void *kmalloc(size_t size, int flags)
void *vmalloc(size_t size)
void vfree(void *addr)
void *kzalloc(unsigned int len, int a)
void kfree(void *p)
void malloc_stats(void)
void malloc_dump()
void mem_heap_check(const char *const func, unsigned int line)
void memory_init(void)
void mem_stats(void)
size_t xPortGetFreeHeapSize(void)
size_t xPortGetMinimumEverFreeHeapSize(void)
size_t xPortGetPhysiceMemorySize(void)
void *get_physic_address(u32 page)
void *vmem_get_phy_adr(void *vaddr)