__free_hook 没有按预期挂钩

__free_hook doesn't hook as expected

来自this Whosebug 问题的选定答案。我决定也记录免费电话。我做了一个日志 free。但是对 free 的调用似乎没有正确输出。

#include <malloc.h>

static void *(*old_malloc_hook)(size_t, const void *);

static void *new_malloc_hook(size_t size, const void *caller) {
    void *mem;

    __malloc_hook = old_malloc_hook;
    mem = malloc(size);
    fprintf(stderr, "%p: malloc(%zu) = %p\n", caller, size, mem);
    __malloc_hook = new_malloc_hook;

    return mem;
}

static void init_malloc_hooks(void) {
    old_malloc_hook = __malloc_hook;
    __malloc_hook = new_malloc_hook;
}

void (*volatile __malloc_initialize_hook)(void) = init_malloc_hooks;


static void (*old_free_hook)(void*, const void *);

static void new_free_hook(void* p, const void *caller) {
    __free_hook = old_free_hook;
    free(p);
    fprintf(stderr, "%p: free(%p)\n", caller, p);
    __free_hook = new_free_hook;
}

static void init_free_hooks(void) {
    old_free_hook = __free_hook;
    __free_hook = new_free_hook;
}

void (*volatile __free_initialize_hook)(void) = init_free_hooks;
_free_initialize_hook

从未调用过。您需要删除

static void init_free_hooks(void) {
  old_free_hook = __free_hook;
  __free_hook = new_free_hook;
}

void (*volatile __free_initialize_hook)(void) = init_free_hooks;

并在 init_malloc_hooks 中初始化两个挂钩:

static void init_malloc_hooks(void) {
  old_malloc_hook = __malloc_hook;
  __malloc_hook = new_malloc_hook;
  old_free_hook = __free_hook;
  __free_hook = new_free_hook;
}