malloc hook初探

在程序中设置钩子,用来在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
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值