OSDN Git Service

b9c7eaf003af65591d1ac08b9f3831800ad5bdce
[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 EXAMPLES
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() might call malloc(), so protect it too. */
113     printf("malloc(%zu) called from %p returns %p\en",
114             size, caller, result);
115
116     /* ユーザーが使おうとするフックを再設定する */
117     __malloc_hook = my_malloc_hook;
118
119     return result;
120 }
121 .EE
122 .SH 関連項目
123 \fBmallinfo\fP(3), \fBmalloc\fP(3), \fBmcheck\fP(3), \fBmtrace\fP(3)
124 .SH この文書について
125 この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は
126 \%https://www.kernel.org/doc/man\-pages/ に書かれている。