From d095876ae6174c38b1911802d8799b0f9ffe6784 Mon Sep 17 00:00:00 2001 From: Wenyong Huang Date: Thu, 1 Sep 2022 16:15:00 +0800 Subject: [PATCH] Enable memory leak check (#1429) Report the memory leak info when building iwasm with `cmake .. -DWAMR_BUILD_GC_VERIFY=1` --- core/config.h | 20 ++++++++++++++++++++ core/iwasm/common/wasm_memory.c | 13 +++++++++++-- core/shared/mem-alloc/ems/ems_kfc.c | 11 ++++++----- core/shared/mem-alloc/mem_alloc.c | 4 ++-- core/shared/mem-alloc/mem_alloc.cmake | 4 ++++ core/shared/mem-alloc/mem_alloc.h | 2 +- product-mini/platforms/nuttx/wamr.mk | 2 +- product-mini/platforms/posix/main.c | 6 +----- 8 files changed, 46 insertions(+), 16 deletions(-) diff --git a/core/config.h b/core/config.h index 6b4392b79..a00d241c6 100644 --- a/core/config.h +++ b/core/config.h @@ -272,6 +272,26 @@ #define BH_ENABLE_GC_VERIFY 0 #endif +/* Enable global heap pool if heap verification is enabled */ +#if BH_ENABLE_GC_VERIFY != 0 +#define WASM_ENABLE_GLOBAL_HEAP_POOL 1 +#endif + +/* Global heap pool */ +#ifndef WASM_ENABLE_GLOBAL_HEAP_POOL +#define WASM_ENABLE_GLOBAL_HEAP_POOL 0 +#endif + +/* Global heap pool size in bytes */ +#ifndef WASM_GLOBAL_HEAP_SIZE +#if WASM_ENABLE_SPEC_TEST != 0 +/* Spec test requires more heap pool size */ +#define WASM_GLOBAL_HEAP_SIZE (300 * 1024 * 1024) +#else +#define WASM_GLOBAL_HEAP_SIZE (10 * 1024 * 1024) +#endif +#endif + /* Max app number of all modules */ #define MAX_APP_INSTALLATIONS 3 diff --git a/core/iwasm/common/wasm_memory.c b/core/iwasm/common/wasm_memory.c index fac6f4af5..49a9b0867 100644 --- a/core/iwasm/common/wasm_memory.c +++ b/core/iwasm/common/wasm_memory.c @@ -75,8 +75,17 @@ wasm_runtime_memory_init(mem_alloc_type_t mem_alloc_type, void wasm_runtime_memory_destroy() { - if (memory_mode == MEMORY_MODE_POOL) - mem_allocator_destroy(pool_allocator); + if (memory_mode == MEMORY_MODE_POOL) { +#if BH_ENABLE_GC_VERIFY == 0 + (void)mem_allocator_destroy(pool_allocator); +#else + int ret = mem_allocator_destroy(pool_allocator); + if (ret != 0) { + /* Memory leak detected */ + exit(-1); + } +#endif + } memory_mode = MEMORY_MODE_UNKNOWN; } diff --git a/core/shared/mem-alloc/ems/ems_kfc.c b/core/shared/mem-alloc/ems/ems_kfc.c index d2a1eb701..cb405fd16 100644 --- a/core/shared/mem-alloc/ems/ems_kfc.c +++ b/core/shared/mem-alloc/ems/ems_kfc.c @@ -125,23 +125,24 @@ int gc_destroy_with_pool(gc_handle_t handle) { gc_heap_t *heap = (gc_heap_t *)handle; + int ret = GC_SUCCESS; + #if BH_ENABLE_GC_VERIFY != 0 hmu_t *cur = (hmu_t *)heap->base_addr; hmu_t *end = (hmu_t *)((char *)heap->base_addr + heap->current_size); + if (!heap->is_heap_corrupted && (hmu_t *)((char *)cur + hmu_get_size(cur)) != end) { os_printf("Memory leak detected:\n"); gci_dump(heap); -#if WASM_ENABLE_SPEC_TEST != 0 - while (1) { - } -#endif + ret = GC_ERROR; } #endif + os_mutex_destroy(&heap->lock); memset(heap->base_addr, 0, heap->current_size); memset(heap, 0, sizeof(gc_heap_t)); - return GC_SUCCESS; + return ret; } uint32 diff --git a/core/shared/mem-alloc/mem_alloc.c b/core/shared/mem-alloc/mem_alloc.c index 3a3748c41..f952c1858 100644 --- a/core/shared/mem-alloc/mem_alloc.c +++ b/core/shared/mem-alloc/mem_alloc.c @@ -25,10 +25,10 @@ mem_allocator_create_with_struct_and_pool(void *struct_buf, pool_buf, pool_buf_size); } -void +int mem_allocator_destroy(mem_allocator_t allocator) { - gc_destroy_with_pool((gc_handle_t)allocator); + return gc_destroy_with_pool((gc_handle_t)allocator); } uint32 diff --git a/core/shared/mem-alloc/mem_alloc.cmake b/core/shared/mem-alloc/mem_alloc.cmake index be57f3794..c0b4157f4 100644 --- a/core/shared/mem-alloc/mem_alloc.cmake +++ b/core/shared/mem-alloc/mem_alloc.cmake @@ -6,6 +6,10 @@ set (MEM_ALLOC_DIR ${CMAKE_CURRENT_LIST_DIR}) include_directories(${MEM_ALLOC_DIR}) +if (WAMR_BUILD_GC_VERIFY EQUAL 1) + add_definitions (-DBH_ENABLE_GC_VERIFY=1) +endif () + file (GLOB_RECURSE source_all ${MEM_ALLOC_DIR}/ems/*.c ${MEM_ALLOC_DIR}/tlsf/*.c diff --git a/core/shared/mem-alloc/mem_alloc.h b/core/shared/mem-alloc/mem_alloc.h index 224eb736b..1f35b2792 100644 --- a/core/shared/mem-alloc/mem_alloc.h +++ b/core/shared/mem-alloc/mem_alloc.h @@ -23,7 +23,7 @@ mem_allocator_create_with_struct_and_pool(void *struct_buf, void *pool_buf, uint32_t pool_buf_size); -void +int mem_allocator_destroy(mem_allocator_t allocator); uint32 diff --git a/product-mini/platforms/nuttx/wamr.mk b/product-mini/platforms/nuttx/wamr.mk index d694cbdce..36953a67d 100644 --- a/product-mini/platforms/nuttx/wamr.mk +++ b/product-mini/platforms/nuttx/wamr.mk @@ -261,7 +261,7 @@ endif ifeq ($(CONFIG_INTERPRETERS_WAMR_GLOBAL_HEAP_POOL),y) CFLAGS += -DWASM_ENABLE_GLOBAL_HEAP_POOL=1 -CFLAGS += -DWASM_GLOBAL_HEAP_SIZE=$(CONFIG_INTERPRETERS_WAMR_GLOBAL_HEAP_POOL_SIZE) +CFLAGS += -DWASM_GLOBAL_HEAP_SIZE="$(CONFIG_INTERPRETERS_WAMR_GLOBAL_HEAP_POOL_SIZE) * 1024" else CFLAGS += -DWASM_ENABLE_GLOBAL_HEAP_POOL=0 endif diff --git a/product-mini/platforms/posix/main.c b/product-mini/platforms/posix/main.c index 944329534..2b3064172 100644 --- a/product-mini/platforms/posix/main.c +++ b/product-mini/platforms/posix/main.c @@ -285,11 +285,7 @@ moudle_destroyer(uint8 *buffer, uint32 size) #endif /* WASM_ENABLE_MULTI_MODULE */ #if WASM_ENABLE_GLOBAL_HEAP_POOL != 0 -#ifdef __NuttX__ -static char global_heap_buf[WASM_GLOBAL_HEAP_SIZE * BH_KB] = { 0 }; -#else -static char global_heap_buf[10 * 1024 * 1024] = { 0 }; -#endif +static char global_heap_buf[WASM_GLOBAL_HEAP_SIZE] = { 0 }; #endif int