mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-05-08 20:56:13 +00:00
Enable memory leak check (#1429)
Report the memory leak info when building iwasm with `cmake .. -DWAMR_BUILD_GC_VERIFY=1`
This commit is contained in:
parent
18774805cc
commit
d095876ae6
|
@ -272,6 +272,26 @@
|
||||||
#define BH_ENABLE_GC_VERIFY 0
|
#define BH_ENABLE_GC_VERIFY 0
|
||||||
#endif
|
#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 */
|
/* Max app number of all modules */
|
||||||
#define MAX_APP_INSTALLATIONS 3
|
#define MAX_APP_INSTALLATIONS 3
|
||||||
|
|
||||||
|
|
|
@ -75,8 +75,17 @@ wasm_runtime_memory_init(mem_alloc_type_t mem_alloc_type,
|
||||||
void
|
void
|
||||||
wasm_runtime_memory_destroy()
|
wasm_runtime_memory_destroy()
|
||||||
{
|
{
|
||||||
if (memory_mode == MEMORY_MODE_POOL)
|
if (memory_mode == MEMORY_MODE_POOL) {
|
||||||
mem_allocator_destroy(pool_allocator);
|
#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;
|
memory_mode = MEMORY_MODE_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -125,23 +125,24 @@ int
|
||||||
gc_destroy_with_pool(gc_handle_t handle)
|
gc_destroy_with_pool(gc_handle_t handle)
|
||||||
{
|
{
|
||||||
gc_heap_t *heap = (gc_heap_t *)handle;
|
gc_heap_t *heap = (gc_heap_t *)handle;
|
||||||
|
int ret = GC_SUCCESS;
|
||||||
|
|
||||||
#if BH_ENABLE_GC_VERIFY != 0
|
#if BH_ENABLE_GC_VERIFY != 0
|
||||||
hmu_t *cur = (hmu_t *)heap->base_addr;
|
hmu_t *cur = (hmu_t *)heap->base_addr;
|
||||||
hmu_t *end = (hmu_t *)((char *)heap->base_addr + heap->current_size);
|
hmu_t *end = (hmu_t *)((char *)heap->base_addr + heap->current_size);
|
||||||
|
|
||||||
if (!heap->is_heap_corrupted
|
if (!heap->is_heap_corrupted
|
||||||
&& (hmu_t *)((char *)cur + hmu_get_size(cur)) != end) {
|
&& (hmu_t *)((char *)cur + hmu_get_size(cur)) != end) {
|
||||||
os_printf("Memory leak detected:\n");
|
os_printf("Memory leak detected:\n");
|
||||||
gci_dump(heap);
|
gci_dump(heap);
|
||||||
#if WASM_ENABLE_SPEC_TEST != 0
|
ret = GC_ERROR;
|
||||||
while (1) {
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
os_mutex_destroy(&heap->lock);
|
os_mutex_destroy(&heap->lock);
|
||||||
memset(heap->base_addr, 0, heap->current_size);
|
memset(heap->base_addr, 0, heap->current_size);
|
||||||
memset(heap, 0, sizeof(gc_heap_t));
|
memset(heap, 0, sizeof(gc_heap_t));
|
||||||
return GC_SUCCESS;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32
|
uint32
|
||||||
|
|
|
@ -25,10 +25,10 @@ mem_allocator_create_with_struct_and_pool(void *struct_buf,
|
||||||
pool_buf, pool_buf_size);
|
pool_buf, pool_buf_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
int
|
||||||
mem_allocator_destroy(mem_allocator_t allocator)
|
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
|
uint32
|
||||||
|
|
|
@ -6,6 +6,10 @@ set (MEM_ALLOC_DIR ${CMAKE_CURRENT_LIST_DIR})
|
||||||
|
|
||||||
include_directories(${MEM_ALLOC_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
|
file (GLOB_RECURSE source_all
|
||||||
${MEM_ALLOC_DIR}/ems/*.c
|
${MEM_ALLOC_DIR}/ems/*.c
|
||||||
${MEM_ALLOC_DIR}/tlsf/*.c
|
${MEM_ALLOC_DIR}/tlsf/*.c
|
||||||
|
|
|
@ -23,7 +23,7 @@ mem_allocator_create_with_struct_and_pool(void *struct_buf,
|
||||||
void *pool_buf,
|
void *pool_buf,
|
||||||
uint32_t pool_buf_size);
|
uint32_t pool_buf_size);
|
||||||
|
|
||||||
void
|
int
|
||||||
mem_allocator_destroy(mem_allocator_t allocator);
|
mem_allocator_destroy(mem_allocator_t allocator);
|
||||||
|
|
||||||
uint32
|
uint32
|
||||||
|
|
|
@ -261,7 +261,7 @@ endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_INTERPRETERS_WAMR_GLOBAL_HEAP_POOL),y)
|
ifeq ($(CONFIG_INTERPRETERS_WAMR_GLOBAL_HEAP_POOL),y)
|
||||||
CFLAGS += -DWASM_ENABLE_GLOBAL_HEAP_POOL=1
|
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
|
else
|
||||||
CFLAGS += -DWASM_ENABLE_GLOBAL_HEAP_POOL=0
|
CFLAGS += -DWASM_ENABLE_GLOBAL_HEAP_POOL=0
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -285,11 +285,7 @@ moudle_destroyer(uint8 *buffer, uint32 size)
|
||||||
#endif /* WASM_ENABLE_MULTI_MODULE */
|
#endif /* WASM_ENABLE_MULTI_MODULE */
|
||||||
|
|
||||||
#if WASM_ENABLE_GLOBAL_HEAP_POOL != 0
|
#if WASM_ENABLE_GLOBAL_HEAP_POOL != 0
|
||||||
#ifdef __NuttX__
|
static char global_heap_buf[WASM_GLOBAL_HEAP_SIZE] = { 0 };
|
||||||
static char global_heap_buf[WASM_GLOBAL_HEAP_SIZE * BH_KB] = { 0 };
|
|
||||||
#else
|
|
||||||
static char global_heap_buf[10 * 1024 * 1024] = { 0 };
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
Loading…
Reference in New Issue
Block a user