OSDN Git Service

66a5d5d90aa3b21d9e3034b927258114ec47c8c1
[linuxjm/LDP_man-pages.git] / release / man3 / malloc_hook.3
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
5 .\"
6 .\" FIXME
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?
10 .\"
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>
13 .\"
14 .TH MALLOC_HOOK 3 2002-07-20 "GNU" "Linux Programmer's Manual"
15 .SH 名前
16 __malloc_hook, __malloc_initialize_hook,
17 __memalign_hook, __free_hook, __realloc_hook,
18 __after_morecore_hook \- malloc デバッグ用の変数
19 .SH 書式
20 .nf
21 .B "#include <malloc.h>"
22 .sp
23 .BI "void *(*__malloc_hook)(size_t " size ", const void *" caller );
24 .sp
25 .BI "void *(*__realloc_hook)(void *" ptr ", size_t " size \
26 ", const void *" caller );
27 .sp
28 .BI "void *(*__memalign_hook)(size_t " alignment ", size_t " size ,
29 .BI "                         const void *" caller );
30 .sp
31 .BI "void (*__free_hook)(void *" ptr ", const void *" caller );
32 .sp
33 .B "void (*__malloc_initialize_hook)(void);"
34 .sp
35 .B "void (*__after_morecore_hook)(void);"
36 .fi
37 .SH 説明
38 GNU C ライブラリでは、適切なフック関数 (hook function) を指定することで
39 .BR malloc (3),
40 .BR realloc (3),
41 .BR free (3)
42 の動作を変更することができる。例えば、動的にメモリ割り当てを行う
43 プログラムのデバッグにこれらのフックを使うことができる。
44 .LP
45 変数
46 .B __malloc_initialize_hook
47 は malloc の実装が初期化される際に一度だけ呼ばれる関数へのポインタである。
48 この変数は書き換え可能 (weak) であり、アプリケーション内で
49 以下のような定義で上書きできる:
50
51 .nf
52     void (*__malloc_initialize_hook)(void) = my_init_hook;
53 .fi
54
55 なお、関数
56 .IR my_init_hook ()
57 で全てのフックの初期化をすることができる。
58 .LP
59 .BR __malloc_hook ,
60 .BR __realloc_hook ,
61 .BR __memalign_hook ,
62 .B __free_hook
63 で指される 4 つの関数は、各々
64 .BR malloc (3),
65 .BR realloc (3),
66 .BR memalign (3),
67 .BR free (3)
68 とよく似たプロトタイプを持っているが、
69 一番最後の引き数
70 .I caller
71 をとる点が異なる。
72 引き数
73 .I caller
74 には、
75 .BR malloc (3)
76 などの呼び出し元 (caller) のアドレスが格納される。
77 .LP
78 変数
79 .B __after_morecore_hook
80 は、領域の追加要求があり
81 .BR sbrk (2)
82 が呼ばれた後で毎回呼び出される関数へのポインタである。
83 .SH 準拠
84 これらの関数は GNU による拡張である。
85 .SH 例
86 これらの変数の使い方の簡単な例を以下に示す。
87 .sp
88 .nf
89 #include <stdio.h>
90 #include <malloc.h>
91
92 /* 使おうとするフックのプロトタイプ宣言 */
93 static void my_init_hook(void);
94 static void *my_malloc_hook(size_t, const void *);
95
96 /* 元々のフックを保存するための変数 */
97 static void *(*old_malloc_hook)(size_t, const void *);
98
99 /* C ライブラリから呼ばれる初期化フックを上書きする */
100 void (*__malloc_initialize_hook) (void) = my_init_hook;
101
102 static void
103 my_init_hook(void)
104 {
105     old_malloc_hook = __malloc_hook;
106     __malloc_hook = my_malloc_hook;
107 }
108
109 static void *
110 my_malloc_hook(size_t size, const void *caller)
111 {
112     void *result;
113
114     /* 元々のフックを全て戻す */
115     __malloc_hook = old_malloc_hook;
116
117     /* malloc の再帰的呼び出し */
118     result = malloc(size);
119
120     /* 現在設定されているフック (underlying hook) を保存する */
121     old_malloc_hook = __malloc_hook;
122
123     /* printf() は malloc() を呼び出す可能性があるので
124         ここでもガードを行う (元々のフックのままにしておく) */
125     printf("malloc(%u) called from %p returns %p\\n",
126             (unsigned int) size, caller, result);
127
128     /* ユーザが使おうとするフックを再設定する */
129     __malloc_hook = my_malloc_hook;
130
131     return result;
132 }
133 .fi
134 .SH 関連項目
135 .BR mallinfo (3),
136 .BR malloc (3),
137 .BR mcheck (3),
138 .BR mtrace (3)