OSDN Git Service

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