malloc_hook(3) - wariua/manpages-ko GitHub Wiki
__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
μ΄ κ°λ¦¬ν€λ λ€ ν¨μλ λ§μ§λ§ μΈμ caller
κ° μλ κ±Έ μ μΈνλ©΄ κ°κ° ν¨μ malloc(3), realloc(3), memalign(3), free(3)μ μνμ΄ κ°λ€. caller
λ malloc(3) λ±μ νΈμΆμμ μ£Όμμ΄λ€.
λ³μ __after_morecore_hook
μ sbrk(2)μ μΆκ° λ©λͺ¨λ¦¬ μμ²μ΄ μμΌλ©΄ μ²λ¦¬ ν νΈμΆλλ ν¨μλ₯Ό κ°λ¦¬ν¨λ€.
μ΄ ν¨μλ€μ GNU νμ₯μ΄λ€.
μ΄ ν
ν¨μλ€μ λ€μ€ μ€λ λ νλ‘κ·Έλ¨μμ μ°κΈ°μ μμ νμ§ μκ³ , κ·Έλμ νμ¬ μ κ±° μμ μνμ΄λ€. glibc 2.24λΆν° APIμμ __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