在程序中设置钩子,用来在malloc, realloc,free的时候,对其进行检查,可以看到对应的函数调用后的地址是什么。这个有时候可以用在debug的时候使用。

几个变量

  • __malloc_hook
    这是一个函数指针变量,指向的是:
      void * function(size_t size, void * caller)

其中caller是表示在栈中调用malloc的函数的时候的函数地址,%p可以打印出他的地址。

  • __free_hook
    同样这个也是一个函数指针变量,指向的是:

      void function(void * ptr, void * caller)
  • __realloc_hook
    这也是指向一个函数指针变量,指向的是:

      void * function(void * ptr ,size_t size, void * caller)
  • __memalign_hook
    这个函数是指向的一个函数指针,不过是:
    aligned_alloc, memalign, posix_memalign and valloc

  • __malloc_initialize_hook

      void (*__malloc_initialize_hook) (void) = my_init_hook;

这是一个弱类型,只是在初始化的时候使用一次。

使用原理

hook函数只是对malloc realloc以及free等函数有一个包装,即每当调用了这些函数后,利用hook函数,可以得到我们想要的结果,比如当前调用的动态分配内存函数的地址,hook变量的值等等

这样在debug的时候,可以知道内存泄漏的地点,当然使用valgrind也是可以的。

例子

 
  1. /*prototype define for us*/

  2. static void my_init_hook(void);

  3. static void *my_malloc_hook(size_t, const void *);

  4. static void *my_free_hook(void *,const void *);

  5. /*some temp variable*/

  6. static void *(*old_malloc_hook)(size_t, const void *);

  7. static void (*old_free_hook)(void *, const void *)

  8. /*initialize hook*/

  9. void (*__malloc_initialize_hook) (void) = my_init_hook;

  10. /*init function*/

  11. static void

  12. my_init_hook(void){

  13. old_malloc_hook = __malloc_hook;

  14. old_free_hook = __free_hook;

  15. __malloc_hook = my_malloc_hook;

  16. __free_hook = my_free_hook;

  17. }

  18. /*my alloc hook*/

  19. static void *

  20. my_malloc_hook(size_t size, const void * caller)

  21. {

  22. void *result; /*malloc's return*/

  23. /*restore all old hooks*/

  24. __malloc_hook = old_malloc_hook;

  25. __free_hook = old_free_hook;

  26. /*call recursively*/

  27. result = malloc(size);

  28. /*save underlying hooks*/

  29. old_malloc_hook = __malloc_hook;

  30. old_free_hook = __free_hook;

  31. /*printf might call malloc, so protect it too*/

  32. printf("malloc(%u) call from %p, return %p\n",(unsigned int)size, caller, result);

  33. /*restore our own hooks*/

  34. __malloc_hook = my_malloc_hook;

  35. __free_hook = my_free_hook;

  36. return result;

  37. }

  38. /*free hook is same like malloc*/

  39. static void

  40. my_free_hook(void *ptr,const void *caller)

  41. {

  42. .....

  43. }

  44. /*main*/

  45. int main(void)

  46. {

  47. char *p;

  48. p = malloc(10);

  49. free(p);

  50. return 0;

  51. }

执行后会输出如下的:

 
  1. 1:__malloc_hook =0 old_malloc_hook = 0

  2. 2:__malloc_hook =0 old_malloc_hook = 0

  3. 3:__malloc_hook =0 old_malloc_hook = 0

  4. malloc(10) caled from 0x4007b0 returns 0x1d253010

  5. 4:__malloc_hook =400620 old_malloc_hook = 0

  6. freed pointer 0x1d253010

输出内容是可以自定制的,也就是hook的用途所在了。更多的内容可以参阅GCC的相关文档。



作者:JesseChen
链接:http://www.jianshu.com/p/0d7aa3166eec
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

GitHub 加速计划 / ma / mall
76.84 K
28.62 K
下载
mall项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现,采用Docker容器化部署。 前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。 后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。
最近提交(Master分支:2 个月前 )
cf9ddbf5 - 3 个月前
70a226f4 - 4 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐