Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // debug.h
- #pragma once
- #define CHILL_DEBUG
- // #define CHILL_DEBUG_PRINTF_MALLOC_FREE
- #ifdef CHILL_DEBUG
- # define CHILL_DEBUG_INIT chill_debug_init()
- # define CHILL_DEBUG_EXIT chill_debug_exit()
- void chill_debug_init();
- void chill_debug_exit();
- void *chill_debug_malloc(const char *lineinfo, size_t size);
- void chill_debug_free(const char *lineinfo, void *ptr);
- void chill_debug_unfreed();
- # define PLS_STRINGIFY(stuff) #stuff
- # define STRINGIFY(stuff) PLS_STRINGIFY(stuff)
- # define CHILL_HERE __FILE__ ":" STRINGIFY(__LINE__)
- # define malloc(size) chill_debug_malloc(CHILL_HERE, (size))
- # define free(ptr) chill_debug_free(CHILL_HERE, (ptr))
- #else
- # define CHILL_DEBUG_INIT
- # define CHILL_DEBUG_EXIT
- #endif
- // debug.c
- #include <stdlib.h>
- #include <stdio.h>
- typedef void *(*MALLOCPROC)(size_t);
- typedef void (*FREEPROC)(void *);
- static MALLOCPROC chill_debug_pmalloc = malloc;
- static FREEPROC chill_debug_pfree = free;
- #include "debug.h"
- typedef struct _chill_debug_memblock_s
- {
- struct _chill_debug_memblock_s *prev, *next;
- const char *lineinfo;
- size_t size;
- } chill_debug_memblock_t;
- static int unfreed_memblock_num;
- static chill_debug_memblock_t first_memblock_fake, last_memblock_fake;
- static chill_debug_memblock_t *first_memblock, *last_memblock;
- void chill_debug_unfreed()
- {
- for (chill_debug_memblock_t *memblock = first_memblock->next; memblock->next; memblock = memblock->next)
- {
- printf("%s: %li bytes of memory\n", memblock->lineinfo, memblock->size);
- }
- }
- void chill_debug_init()
- {
- unfreed_memblock_num = 0;
- first_memblock = &first_memblock_fake;
- last_memblock = &last_memblock_fake;
- first_memblock->prev = NULL;
- first_memblock->next = last_memblock;
- last_memblock->prev = first_memblock;
- last_memblock->next = NULL;
- }
- void chill_debug_exit()
- {
- if (unfreed_memblock_num)
- {
- printf("DEBUG WARNING: There are %i unfreed memory blocks:\n", unfreed_memblock_num);
- chill_debug_unfreed();
- }
- }
- void *chill_debug_malloc(const char *lineinfo, size_t size)
- {
- #ifdef CHILL_DEBUG_PRINTF_MALLOC_FREE
- printf("%s: attempting to malloc %li bytes of memory ... ", lineinfo, size);
- #endif
- size_t offset = sizeof(chill_debug_memblock_t);
- void *result = chill_debug_pmalloc(size + offset);
- if (!result)
- {
- #ifdef CHILL_DEBUG_PRINTF_MALLOC_FREE
- puts("fail. exit.\n");
- #endif
- exit(1);
- }
- chill_debug_memblock_t *memblock = result;
- memblock->lineinfo = lineinfo;
- memblock->size = size;
- memblock->prev = last_memblock->prev;
- memblock->next = last_memblock;
- memblock->prev->next = memblock;
- memblock->next->prev = memblock;
- #ifdef CHILL_DEBUG_PRINTF_MALLOC_FREE
- puts("ok.\n");
- #endif
- ++unfreed_memblock_num;
- return result + offset;
- }
- void chill_debug_free(const char *lineinfo, void *ptr)
- {
- size_t offset = sizeof(chill_debug_memblock_t);
- chill_debug_memblock_t *memblock = ptr - offset;
- memblock->prev->next = memblock->next;
- memblock->next->prev = memblock->prev;
- #ifdef CHILL_DEBUG_PRINTF_MALLOC_FREE
- printf("%s: freeing %li bytes of memory allocated at %s\n", lineinfo, memblock->size, memblock->lineinfo);
- #endif
- chill_debug_pfree(memblock);
- --unfreed_memblock_num;
- }
Add Comment
Please, Sign In to add comment