- bullseye-backports 4.17.0-2~bpo11+1
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() might call malloc(), so protect it too. */
printf("malloc(%zu) called from %p returns %p\n",
size, caller, result);
/* восстанавливаем наши функции */
__malloc_hook = my_malloc_hook;
return result; }
СМ. ТАКЖЕ¶
ЗАМЕЧАНИЯ¶
Эта страница является частью проекта Linux man-pages версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.
ПЕРЕВОД¶
Русский перевод этой страницы руководства был сделан aereiae <aereiae@gmail.com>, Alexey <a.chepugov@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, ITriskTI <ITriskTI@gmail.com>, Max Is <ismax799@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов <pavia00@gmail.com> и Малянов Евгений Викторович <maljanow@outlook.com>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
1 ноября 2020 г. | GNU |