MALLOC_HOOK - Linux手册页
Linux程序员手册 第3部分
更新日期: 2020-06-09
名称
malloc_hook,malloc_initialize_hook,__ memalign_hook,__ free_hook,__ realloc_hook,__ after_morecore_hook-malloc调试变量
语法
#include <malloc.h> void *(*__malloc_hook)(size_t size, const void *caller); void *(*__realloc_hook)(void *ptr, size_t size, const void *caller); void *(*__memalign_hook)(size_t alignment, size_t size, const void *caller); void (*__free_hook)(void *ptr, const void *caller); void (*__malloc_initialize_hook)(void); void (*__after_morecore_hook)(void);
说明
GNU C库允许您通过指定适当的钩子函数来修改malloc(3),realloc(3)和free(3)的行为。例如,您可以使用这些挂钩来帮助调试使用动态内存分配的程序。
__malloc_initialize_hook变量指向在初始化malloc实现时调用一次的函数。这是一个弱变量,因此可以在应用程序中使用如下定义覆盖它:
void (*__malloc_initialize_hook)(void) = my_init_hook;
现在,函数my_init_hook()可以初始化所有挂钩。
malloc_hook,realloc_hook,__ memalign_hook,__ free_hook所指向的四个函数分别具有类似于函数malloc(3),realloc(3),memalign(3),free(3)的原型,不同之处在于它们具有最终的参数调用方:给出malloc(3)的调用者的地址,等等。
变量__after_morecore_hook指向在每次要求sbrk(2)提供更多内存后都会调用的函数。
遵循规范
这些功能是GNU扩展。
备注
在多线程程序中使用这些挂钩函数并不安全,现在已弃用它们。从glibc 2.24开始,__ malloc_initialize_hook变量已从API中删除。程序员应该改为通过定义和导出诸如" malloc"和" free"之类的功能来抢占相关功能。
示例
这是有关如何使用这些变量的简短示例。
#include <stdio.h> #include <malloc.h> /* Prototypes for our hooks. */ static void my_init_hook(void); static void *my_malloc_hook(size_t, const void *); /* Variables to save original hooks. */ static void *(*old_malloc_hook)(size_t, const void *); /* Override initializing hook from the C library. */ void (*__malloc_initialize_hook) (void) = my_init_hook; static void my_init_hook(void) { old_malloc_hook = __malloc_hook; __malloc_hook = my_malloc_hook; } static void * my_malloc_hook(size_t size, const void *caller) { void *result; /* Restore all old hooks */ __malloc_hook = old_malloc_hook; /* Call recursively */ result = malloc(size); /* Save underlying hooks */ old_malloc_hook = __malloc_hook; /* printf() might call malloc(), so protect it too. */ printf("malloc(%u) called from %p returns %p\n", (unsigned int) size, caller, result); /* Restore our own hooks */ __malloc_hook = my_malloc_hook; return result; }
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。