log_dump: level+category, memory_pool: дамп user_data через log_dump при коррапшне
This commit is contained in:
1 parent
81cad40e3b
commit
9e133699bf
5 files changed
+31
-44
No files matched your search
+9
-21
@@ -22,17 +22,6 @@ static void pool_init_tags(struct memory_pool* pool, void* obj, const char* loca
|
||||
*counter = 1;
|
||||
}
|
||||
|
||||
static void pool_dump_object(void* obj, size_t len, const char* prefix)
|
||||
{
|
||||
unsigned char* p = (unsigned char*)obj;
|
||||
char line[128];
|
||||
int pos;
|
||||
size_t cnt = len < 32 ? len : 32;
|
||||
pos = snprintf(line, sizeof(line), " %s [%zu]:", prefix, len);
|
||||
for (size_t i = 0; i < cnt; i++) pos += snprintf(line + pos, sizeof(line) - pos, " %02x", p[i]);
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_MEMORY, "%s", line);
|
||||
}
|
||||
|
||||
static void pool_check_and_clear_tags(struct memory_pool* pool, void* obj, const char* location)
|
||||
{
|
||||
uint32_t* canary = (uint32_t*)((uint8_t*)obj + POOL_CANARY_OFF);
|
||||
@@ -40,20 +29,19 @@ static void pool_check_and_clear_tags(struct memory_pool* pool, void* obj, const
|
||||
uint8_t* counter = (uint8_t*)obj + POOL_COUNTER_OFF;
|
||||
|
||||
if (*canary != POOL_CANARY_VAL) {
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_MEMORY, "pool_free BUFFER OVERFLOW obj=%p sz=%zu alloc=%s free=%s canary=0x%08x expected=0x%08x",
|
||||
obj, pool->object_size, *loc ? *loc : "(null)", location, *canary, POOL_CANARY_VAL);
|
||||
pool_dump_object(obj, pool->object_size, "head");
|
||||
pool_dump_object((uint8_t*)obj + (pool->object_size > 32 ? pool->object_size - 32 : 0),
|
||||
pool->object_size < 32 ? pool->object_size : 32, "tail");
|
||||
// dump raw canary area
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_MEMORY, " canary_raw: %02x %02x %02x %02x loc=%p",
|
||||
((uint8_t*)canary)[0], ((uint8_t*)canary)[1], ((uint8_t*)canary)[2], ((uint8_t*)canary)[3], (void*)*loc);
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_MEMORY, "pool_free BUFFER OVERFLOW pool=%p sz=%zu allocs=%zu reuse=%zu free=%d",
|
||||
pool, pool->object_size, pool->allocations, pool->reuse_count, pool->free_count);
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_MEMORY, " obj=%p alloc=%s free=%s canary=0x%08x expected=0x%08x",
|
||||
obj, *loc ? *loc : "(null)", location, *canary, POOL_CANARY_VAL);
|
||||
if (pool->object_size)
|
||||
log_dump(DEBUG_LEVEL_ERROR, DEBUG_CATEGORY_MEMORY, " user_data", obj, pool->object_size);
|
||||
volatile int _halt = 1;
|
||||
while (_halt) {}
|
||||
}
|
||||
if (*counter == 0) {
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_MEMORY, "pool_free DOUBLE FREE obj=%p alloc=%s free=%s! halting",
|
||||
obj, *loc ? *loc : "(null)", location);
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_MEMORY, "pool_free DOUBLE FREE pool=%p sz=%zu allocs=%zu reuse=%zu alloc=%s free=%s",
|
||||
pool, pool->object_size, pool->allocations, pool->reuse_count,
|
||||
*loc ? *loc : "(null)", location);
|
||||
volatile int _halt = 1;
|
||||
while (_halt) {}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user