OSDN Git Service

(split) DP: release pages (catch up to 3.50).
[linuxjm/LDP_man-pages.git] / release / 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 The use of these hook functions is not safe in multithreaded programs, and
62 they are now deprecated.  Programmers should instead preempt calls to the
63 relevant functions by defining and exporting functions such as "malloc" and
64 "free".
65 .SH 例
66 これらの変数の使い方の簡単な例を以下に示す。
67 .sp
68 .nf
69 #include <stdio.h>
70 #include <malloc.h>
71
72 /* 使おうとするフックのプロトタイプ宣言 */
73 static void my_init_hook(void);
74 static void *my_malloc_hook(size_t, const void *);
75
76 /* 元々のフックを保存するための変数 */
77 static void *(*old_malloc_hook)(size_t, const void *);
78
79 /* C ライブラリから呼ばれる初期化フックを上書きする */
80 void (*__malloc_initialize_hook) (void) = my_init_hook;
81
82 static void
83 my_init_hook(void)
84 {
85     old_malloc_hook = __malloc_hook;
86     __malloc_hook = my_malloc_hook;
87 }
88
89 static void *
90 my_malloc_hook(size_t size, const void *caller)
91 {
92     void *result;
93
94     /* 元々のフックを全て戻す */
95     __malloc_hook = old_malloc_hook;
96
97     /* malloc の再帰的呼び出し */
98     result = malloc(size);
99
100     /* 現在設定されているフック (underlying hook) を保存する */
101     old_malloc_hook = __malloc_hook;
102
103     /* printf() は malloc() を呼び出す可能性があるので
104         ここでもガードを行う (元々のフックのままにしておく) */
105     printf("malloc(%u) called from %p returns %p\en",
106             (unsigned int) size, caller, result);
107
108     /* ユーザが使おうとするフックを再設定する */
109     __malloc_hook = my_malloc_hook;
110
111     return result;
112 }
113 .fi
114 .SH 関連項目
115 \fBmallinfo\fP(3), \fBmalloc\fP(3), \fBmcheck\fP(3), \fBmtrace\fP(3)
116 .SH この文書について
117 この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.50 の一部
118 である。プロジェクトの説明とバグ報告に関する情報は
119 http://www.kernel.org/doc/man\-pages/ に書かれている。