malloc_hookのヘルプ・マニュアル
日本語 英語
malloc_hook --help
man malloc_hook
MALLOC_HOOK(3) Linux Programmer’s Manual MALLOC_HOOK(3)
名前
__malloc_hook, __malloc_initialize_hook, __memalign_hook, __free_hook,
__realloc_hook, __after_morecore_hook - malloc デバッグ用の変数
書式
#include
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 ライブラリでは、適切なフック関数 (hook function) を指定することで
malloc(3), realloc(3), free(3) の動作を変更することができる。例えば、動
的にメモリ割り当てを行うプログラムのデバッグにこれらのフックを使うこ と
ができる。
変 数 __malloc_initialize_hook は malloc の実装が初期化される際に一度だ
け呼ばれる関数へのポインタである。この変数は書き換え可能 (weak) であ り
、アプリケーション内で以下のような定義で上書きできる:
void (*__malloc_initialize_hook)(void) = my_init_hook;
なお、関数 my_init_hook() で全てのフックの初期化をすることができる。
__malloc_hook, __realloc_hook, __memalign_hook, __free_hook で指される
4 つの関数は、各々 malloc(3), realloc(3), memalign(3), free(3) とよく似
た プロトタイプを持っているが、一番最後の引き数 caller をとる点が異なる
。引き数 caller には、 malloc(3) などの呼び出し元 (caller) のアドレスが
格納される。
変 数 __after_morecore_hook は、領域の追加要求があり sbrk(2) が呼ばれた
後で毎回呼び出される関数へのポインタである。
準拠
これらの関数は GNU による拡張である。
例
これらの変数の使い方の簡単な例を以下に示す。
#include
#include
/* 使おうとするフックのプロトタイプ宣言 */
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;
/* malloc の再帰的呼び出し */
result = malloc(size);
/* 現在設定されているフック (underlying hook) を保存する */
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)
GNU 2002-07-20 MALLOC_HOOK(3)
MALLOC_HOOK(3) Linux Programmer’s Manual MALLOC_HOOK(3)
NAME
__malloc_hook, __malloc_initialize_hook, __memalign_hook, __free_hook,
__realloc_hook, __after_morecore_hook - malloc debugging variables
SYNOPSIS
#include
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
The GNU C library lets you modify the behavior of malloc(3), real-
loc(3), and free(3) by specifying appropriate hook functions. You can
use these hooks to help you debug programs that use dynamic memory
allocation, for example.
The variable __malloc_initialize_hook points at a function that is
called once when the malloc implementation is initialized. This is a
weak variable, so it can be overridden in the application with a defi-
nition like the following:
void (*__malloc_initialize_hook)(void) = my_init_hook;
Now the function my_init_hook() can do the initialization of all hooks.
The four functions pointed to by __malloc_hook, __realloc_hook, __mema-
lign_hook, __free_hook have a prototype like the functions malloc(3),
realloc(3), memalign(3), free(3), respectively, except that they have a
final argument caller that gives the address of the caller of mal-
loc(3), etc.
The variable __after_morecore_hook points at a function that is called
each time after sbrk(2) was asked for more memory.
Hook variables are not thread-safe so they are deprecated now. Pro-
grammers should instead preempt callst to the relevant functions by
defining and exporting functions like "malloc" and "free".
CONFORMING TO
These functions are GNU extensions.
EXAMPLE
Here is a short example of how to use these variables.
#include
#include
/* Prototypes for our hooks. */
static void my_init_hook(void);
static void *my_malloc_hook(size_t, const void *);
/* Variables to save original hooks. */
static void *(*old_malloc_hook)(size_t, const void *);
/* Override initializing hook from the C library. */
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;
/* Restore all old hooks */
__malloc_hook = old_malloc_hook;
/* Call recursively */
result = malloc(size);
/* Save underlying hooks */
old_malloc_hook = __malloc_hook;
/* printf() might call malloc(), so protect it too. */
printf("malloc(%u) called from %p returns %p\n",
(unsigned int) size, caller, result);
/* Restore our own hooks */
__malloc_hook = my_malloc_hook;
return result;
}
SEE ALSO
mallinfo(3), malloc(3), mcheck(3), mtrace(3)
COLOPHON
This page is part of release 3.22 of the Linux man-pages project. A
description of the project, and information about reporting bugs, can
be found at http://www.kernel.org/doc/man-pages/.
GNU 2002-07-20 MALLOC_HOOK(3)