OSDN Git Service

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