1 .\" Copyright 2002 Walter Harms (walter.harms@informatik.uni-oldenburg.de)
2 .\" Distributed under GPL
3 .\" Heavily based on glibc documentation
4 .\" Polished, added docs, removed glibc doc bug, 2002-07-20, aeb
7 .\" According to a Fedora downstream patch, malloc hooks are deprecated
8 .\" https://bugzilla.redhat.com/show_bug.cgi?id=450187
9 .\" Integrate this upstream?
11 .\" Japanese Version Copyright (c) 2002 Akihiro MOTOKI all rights reserved.
12 .\" Translated Thu 05 Dec 2002 by Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
14 .TH MALLOC_HOOK 3 2002-07-20 "GNU" "Linux Programmer's Manual"
16 __malloc_hook, __malloc_initialize_hook,
17 __memalign_hook, __free_hook, __realloc_hook,
18 __after_morecore_hook \- malloc デバッグ用の変数
21 .B "#include <malloc.h>"
23 .BI "void *(*__malloc_hook)(size_t " size ", const void *" caller );
25 .BI "void *(*__realloc_hook)(void *" ptr ", size_t " size \
26 ", const void *" caller );
28 .BI "void *(*__memalign_hook)(size_t " alignment ", size_t " size ,
29 .BI " const void *" caller );
31 .BI "void (*__free_hook)(void *" ptr ", const void *" caller );
33 .B "void (*__malloc_initialize_hook)(void);"
35 .B "void (*__after_morecore_hook)(void);"
38 GNU C ライブラリでは、適切なフック関数 (hook function) を指定することで
42 の動作を変更することができる。例えば、動的にメモリ割り当てを行う
43 プログラムのデバッグにこれらのフックを使うことができる。
46 .B __malloc_initialize_hook
47 は malloc の実装が初期化される際に一度だけ呼ばれる関数へのポインタである。
48 この変数は書き換え可能 (weak) であり、アプリケーション内で
52 void (*__malloc_initialize_hook)(void) = my_init_hook;
76 などの呼び出し元 (caller) のアドレスが格納される。
79 .B __after_morecore_hook
82 が呼ばれた後で毎回呼び出される関数へのポインタである。
86 これらの変数の使い方の簡単な例を以下に示す。
92 /* 使おうとするフックのプロトタイプ宣言 */
93 static void my_init_hook(void);
94 static void *my_malloc_hook(size_t, const void *);
96 /* 元々のフックを保存するための変数 */
97 static void *(*old_malloc_hook)(size_t, const void *);
99 /* C ライブラリから呼ばれる初期化フックを上書きする */
100 void (*__malloc_initialize_hook) (void) = my_init_hook;
105 old_malloc_hook = __malloc_hook;
106 __malloc_hook = my_malloc_hook;
110 my_malloc_hook(size_t size, const void *caller)
115 __malloc_hook = old_malloc_hook;
117 /* malloc の再帰的呼び出し */
118 result = malloc(size);
120 /* 現在設定されているフック (underlying hook) を保存する */
121 old_malloc_hook = __malloc_hook;
123 /* printf() は malloc() を呼び出す可能性があるので
124 ここでもガードを行う (元々のフックのままにしておく) */
125 printf("malloc(%u) called from %p returns %p\\n",
126 (unsigned int) size, caller, result);
128 /* ユーザが使おうとするフックを再設定する */
129 __malloc_hook = my_malloc_hook;