malloc_hook(3) - wariua/manpages-ko GitHub Wiki

NAME

__malloc_hook, __malloc_initialize_hook, __memalign_hook, __free_hook, __realloc_hook, __after_morecore_hook - malloc 디버깅 λ³€μˆ˜

SYNOPSIS

#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);

DESCRIPTION

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)에 μΆ”κ°€ λ©”λͺ¨λ¦¬ μš”μ²­μ΄ 있으면 처리 ν›„ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜λ₯Ό 가리킨닀.

CONFORMING TO

이 ν•¨μˆ˜λ“€μ€ GNU ν™•μž₯이닀.

NOTES

이 ν›… ν•¨μˆ˜λ“€μ€ 닀쀑 μŠ€λ ˆλ“œ ν”„λ‘œκ·Έλž¨μ—μ„œ 쓰기에 μ•ˆμ „ν•˜μ§€ μ•Šκ³ , κ·Έλž˜μ„œ ν˜„μž¬ 제거 μ˜ˆμ • μƒνƒœμ΄λ‹€. glibc 2.24λΆ€ν„° APIμ—μ„œ __malloc_initialize_hook이 μ—†μ–΄μ‘Œλ‹€. ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ€ λŒ€μ‹  "malloc"μ΄λ‚˜ "free" 같은 ν•¨μˆ˜λ₯Ό μ •μ˜ν•΄μ„œ λ‚΄λ³΄μ΄λŠ” λ°©μ‹μœΌλ‘œ κ΄€λ ¨ ν•¨μˆ˜ ν˜ΈμΆœμ„ 선점해야 ν•œλ‹€.

EXAMPLE

λ‹€μŒμ€ κ°„λ‹¨ν•œ μ‚¬μš© μ˜ˆμ‹œμ΄λ‹€.

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

SEE ALSO

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


2019-03-06

⚠️ **GitHub.com Fallback** ⚠️