LBPHacker

malloc/free debug stuff

Jun 3rd, 2016
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.19 KB | None | 0 0
  1. // debug.h
  2.  
  3. #pragma once
  4.  
  5. #define CHILL_DEBUG
  6. // #define CHILL_DEBUG_PRINTF_MALLOC_FREE
  7.  
  8. #ifdef CHILL_DEBUG
  9. # define CHILL_DEBUG_INIT chill_debug_init()
  10. # define CHILL_DEBUG_EXIT chill_debug_exit()
  11.  
  12. void chill_debug_init();
  13. void chill_debug_exit();
  14. void *chill_debug_malloc(const char *lineinfo, size_t size);
  15. void chill_debug_free(const char *lineinfo, void *ptr);
  16. void chill_debug_unfreed();
  17.  
  18. # define PLS_STRINGIFY(stuff) #stuff
  19. # define STRINGIFY(stuff) PLS_STRINGIFY(stuff)
  20. # define CHILL_HERE __FILE__ ":" STRINGIFY(__LINE__)
  21. # define malloc(size) chill_debug_malloc(CHILL_HERE, (size))
  22. # define free(ptr) chill_debug_free(CHILL_HERE, (ptr))
  23. #else
  24. # define CHILL_DEBUG_INIT
  25. # define CHILL_DEBUG_EXIT
  26. #endif
  27.  
  28.  
  29. // debug.c
  30.  
  31. #include <stdlib.h>
  32. #include <stdio.h>
  33.  
  34. typedef void *(*MALLOCPROC)(size_t);
  35. typedef void (*FREEPROC)(void *);
  36.  
  37. static MALLOCPROC chill_debug_pmalloc = malloc;
  38. static FREEPROC chill_debug_pfree = free;
  39.  
  40. #include "debug.h"
  41.  
  42. typedef struct _chill_debug_memblock_s
  43. {
  44.     struct _chill_debug_memblock_s *prev, *next;
  45.     const char *lineinfo;
  46.     size_t size;
  47. } chill_debug_memblock_t;
  48.  
  49. static int unfreed_memblock_num;
  50. static chill_debug_memblock_t first_memblock_fake, last_memblock_fake;
  51. static chill_debug_memblock_t *first_memblock, *last_memblock;
  52.  
  53. void chill_debug_unfreed()
  54. {
  55.     for (chill_debug_memblock_t *memblock = first_memblock->next; memblock->next; memblock = memblock->next)
  56.     {
  57.         printf("%s: %li bytes of memory\n", memblock->lineinfo, memblock->size);
  58.     }
  59. }
  60.  
  61. void chill_debug_init()
  62. {
  63.     unfreed_memblock_num = 0;
  64.     first_memblock = &first_memblock_fake;
  65.     last_memblock = &last_memblock_fake;
  66.     first_memblock->prev = NULL;
  67.     first_memblock->next = last_memblock;
  68.     last_memblock->prev = first_memblock;
  69.     last_memblock->next = NULL;
  70. }
  71.  
  72. void chill_debug_exit()
  73. {
  74.     if (unfreed_memblock_num)
  75.     {
  76.         printf("DEBUG WARNING: There are %i unfreed memory blocks:\n", unfreed_memblock_num);
  77.         chill_debug_unfreed();
  78.     }
  79. }
  80.  
  81. void *chill_debug_malloc(const char *lineinfo, size_t size)
  82. {
  83. #ifdef CHILL_DEBUG_PRINTF_MALLOC_FREE
  84.     printf("%s: attempting to malloc %li bytes of memory ... ", lineinfo, size);
  85. #endif
  86.  
  87.     size_t offset = sizeof(chill_debug_memblock_t);
  88.     void *result = chill_debug_pmalloc(size + offset);
  89.     if (!result)
  90.     {
  91. #ifdef CHILL_DEBUG_PRINTF_MALLOC_FREE
  92.         puts("fail. exit.\n");
  93. #endif
  94.         exit(1);
  95.     }
  96.    
  97.     chill_debug_memblock_t *memblock = result;
  98.     memblock->lineinfo = lineinfo;
  99.     memblock->size = size;
  100.     memblock->prev = last_memblock->prev;
  101.     memblock->next = last_memblock;
  102.     memblock->prev->next = memblock;
  103.     memblock->next->prev = memblock;
  104.    
  105. #ifdef CHILL_DEBUG_PRINTF_MALLOC_FREE
  106.     puts("ok.\n");
  107. #endif
  108.  
  109.     ++unfreed_memblock_num;
  110.    
  111.     return result + offset;
  112. }
  113.  
  114. void chill_debug_free(const char *lineinfo, void *ptr)
  115. {
  116.     size_t offset = sizeof(chill_debug_memblock_t);
  117.    
  118.     chill_debug_memblock_t *memblock = ptr - offset;
  119.     memblock->prev->next = memblock->next;
  120.     memblock->next->prev = memblock->prev;
  121.    
  122. #ifdef CHILL_DEBUG_PRINTF_MALLOC_FREE
  123.     printf("%s: freeing %li bytes of memory allocated at %s\n", lineinfo, memblock->size, memblock->lineinfo);
  124. #endif
  125.  
  126.     chill_debug_pfree(memblock);
  127.    
  128.     --unfreed_memblock_num;
  129. }
Add Comment
Please, Sign In to add comment