7.14. MALLOC
Overview 提供内存申请接口应用示例、常用相关 API 介绍和常见问题。
7.14.1. 应用示例
示例演示:
内存申请接口如何使用;
内存泄漏如何查找;
内存被篡改如何定位;
内存碎片解决方法;
example: 进入 apps/demo/demo_DevKitBoard/include/demo_config.h
,开启宏 USE_MALLOC_TEST_DEMO
。
7.14.2. 常见问题
如何查看内存使用情况?
答:
``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
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
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)