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/。

