MALLOC_HOOK(3) Руководство программиста Linux MALLOC_HOOK(3)

ИМЯ

__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), realoc(3) и free(3), указав соответствующие «обрабатывающие» (hook) функции. Вы можете использовать эти функции-обработчики для отладки программ, использующих динамическое выделение памяти.

Переменная __ 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), соответственно, однако у них есть дополнительный последний параметр caller, в который передаётся адрес вызывающего malloc(3) и т.д.

Переменная __ after_morecore_hook указывает на функцию, которая вызывается каждый раз после того, как sbrk(2) просят увеличить память.

СООТВЕТСТВИЕ СТАНДАРТАМ

Эти функции являются расширениями GNU.

ЗАМЕЧАНИЯ

Использование этих обрабатывающих функций не безопасно в многонитевых программах, и теперь они считаются устаревшими. Начиная с glibc версии 2.24, переменная __ malloc_initialize_hook была удалена из программного интерфейса. Теперь вместо неё программисты должны подменять вызовы соответствующих функций, определяя и экспортируя такие функции как «malloc» и «free».

ПРИМЕР

Вот короткий пример того, как использовать эти переменные.

#include <stdio.h>
#include <malloc.h>
/* прототипы наших функций */
static void my_init_hook(void);
static void *my_malloc_hook(size_t, const void *);
/* переменные для сохранения имеющихся обрабатывающих функций */
static void *(*old_malloc_hook)(size_t, const void *);
/* переопределяем первоначальные функции библиотеки C */
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;

    /* Восстанавливаем старые функции */

    __malloc_hook = old_malloc_hook;

    /* вызываем рекурсивно */

    result = malloc(size);

    /* сохраняем нижележащие функции */

    old_malloc_hook = __malloc_hook;

    /* printf() тоже может вызвать malloc(), поэтому его тоже надо защитить */

    printf("malloc(%u) called from %p returns %p\n",

            (unsigned int) size, caller, result);

    /* восстанавливаем наши функции */

    __malloc_hook = my_malloc_hook;

    return result;
}

СМОТРИТЕ ТАКЖЕ

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

2019-03-06 GNU