MALLOC_HOOK - Linux手册页

时间:2019-08-20 18:00:50  来源:igfitidea点击:

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_hookrealloc_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;
}

另外参见

mallinfo(3),malloc(3),mcheck(3),mtrace(3)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/