OSDN Git Service

160f4d3d45dcfd39ace14cbd89f6f9cf0164feae
[linuxjm/LDP_man-pages.git] / draft / man3 / malloc_hook.3
1 .\" Copyright 2002 Walter Harms (walter.harms@informatik.uni-oldenburg.de)
2 .\"
3 .\" %%%LICENSE_START(GPL_NOVERSION_ONELINE)
4 .\" Distributed under GPL
5 .\" %%%LICENSE_END
6 .\"
7 .\" Heavily based on glibc documentation
8 .\" Polished, added docs, removed glibc doc bug, 2002-07-20, aeb
9 .\"
10 .\"*******************************************************************
11 .\"
12 .\" This file was generated with po4a. Translate the source file.
13 .\"
14 .\"*******************************************************************
15 .TH MALLOC_HOOK 3 2010\-10\-13 GNU "Linux Programmer's Manual"
16 .SH 名前
17 __malloc_hook, __malloc_initialize_hook, __memalign_hook, __free_hook,
18 __realloc_hook, __after_morecore_hook \- malloc デバッグ用の変数
19 .SH 書式
20 .nf
21 \fB#include <malloc.h>\fP
22 .sp
23 \fBvoid *(*__malloc_hook)(size_t \fP\fIsize\fP\fB, const void *\fP\fIcaller\fP\fB);\fP
24 .sp
25 \fBvoid *(*__realloc_hook)(void *\fP\fIptr\fP\fB, size_t \fP\fIsize\fP\fB, const void *\fP\fIcaller\fP\fB);\fP
26 .sp
27 \fBvoid *(*__memalign_hook)(size_t \fP\fIalignment\fP\fB, size_t \fP\fIsize\fP\fB,\fP
28 \fB                         const void *\fP\fIcaller\fP\fB);\fP
29 .sp
30 \fBvoid (*__free_hook)(void *\fP\fIptr\fP\fB, const void *\fP\fIcaller\fP\fB);\fP
31 .sp
32 \fBvoid (*__malloc_initialize_hook)(void);\fP
33 .sp
34 \fBvoid (*__after_morecore_hook)(void);\fP
35 .fi
36 .SH 説明
37 GNU C ライブラリでは、適切なフック関数 (hook function) を指定することで \fBmalloc\fP(3), \fBrealloc\fP(3),
38 \fBfree\fP(3)  の動作を変更することができる。例えば、動的にメモリ割り当てを行う プログラムのデバッグにこれらのフックを使うことができる。
39 .LP
40 変数 \fB__malloc_initialize_hook\fP は malloc の実装が初期化される際に一度だけ呼ばれる関数へのポインタである。
41 この変数は書き換え可能 (weak) であり、アプリケーション内で 以下のような定義で上書きできる:
42 .nf
43
44     void (*__malloc_initialize_hook)(void) = my_init_hook;
45
46 .fi
47 なお、関数 \fImy_init_hook\fP()  で全てのフックの初期化をすることができる。
48 .LP
49 \fB__malloc_hook\fP, \fB__realloc_hook\fP, \fB__memalign_hook\fP, \fB__free_hook\fP
50 で指される 4 つの関数は、各々 \fBmalloc\fP(3), \fBrealloc\fP(3), \fBmemalign\fP(3), \fBfree\fP(3)
51 とよく似たプロトタイプを持っているが、 一番最後の引き数 \fIcaller\fP をとる点が異なる。 引き数 \fIcaller\fP には、
52 \fBmalloc\fP(3)  などの呼び出し元 (caller) のアドレスが格納される。
53 .LP
54 変数 \fB__after_morecore_hook\fP は、領域の追加要求があり \fBsbrk\fP(2)
55 が呼ばれた後で毎回呼び出される関数へのポインタである。
56 .SH 準拠
57 これらの関数は GNU による拡張である。
58 .SH 注意
59 .\" https://bugzilla.redhat.com/show_bug.cgi?id=450187
60 .\" http://sourceware.org/bugzilla/show_bug.cgi?id=9957
61 マルチスレッドプログラムでは、 これらのフック関数の使用は安全ではなく、 今では非推奨である。 プログラマは、 "malloc" や "free"
62 のような関数を定義して公開して、 関連する関数を呼び出すようにすべきである。
63 .SH 例
64 これらの変数の使い方の簡単な例を以下に示す。
65 .sp
66 .nf
67 #include <stdio.h>
68 #include <malloc.h>
69
70 /* 使おうとするフックのプロトタイプ宣言 */
71 static void my_init_hook(void);
72 static void *my_malloc_hook(size_t, const void *);
73
74 /* 元々のフックを保存するための変数 */
75 static void *(*old_malloc_hook)(size_t, const void *);
76
77 /* C ライブラリから呼ばれる初期化フックを上書きする */
78 void (*__malloc_initialize_hook) (void) = my_init_hook;
79
80 static void
81 my_init_hook(void)
82 {
83     old_malloc_hook = __malloc_hook;
84     __malloc_hook = my_malloc_hook;
85 }
86
87 static void *
88 my_malloc_hook(size_t size, const void *caller)
89 {
90     void *result;
91
92     /* 元々のフックを全て戻す */
93     __malloc_hook = old_malloc_hook;
94
95     /* malloc の再帰的呼び出し */
96     result = malloc(size);
97
98     /* 現在設定されているフック (underlying hook) を保存する */
99     old_malloc_hook = __malloc_hook;
100
101     /* printf() は malloc() を呼び出す可能性があるので
102         ここでもガードを行う (元々のフックのままにしておく) */
103     printf("malloc(%u) called from %p returns %p\en",
104             (unsigned int) size, caller, result);
105
106     /* ユーザが使おうとするフックを再設定する */
107     __malloc_hook = my_malloc_hook;
108
109     return result;
110 }
111 .fi
112 .SH 関連項目
113 \fBmallinfo\fP(3), \fBmalloc\fP(3), \fBmcheck\fP(3), \fBmtrace\fP(3)
114 .SH この文書について
115 この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.52 の一部
116 である。プロジェクトの説明とバグ報告に関する情報は
117 http://www.kernel.org/doc/man\-pages/ に書かれている。