File: malloc_hook.3

package info (click to toggle)
manpages-ja 0.5.0.0.20180315%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 28,516 kB
  • sloc: perl: 161; makefile: 101
file content (123 lines) | stat: -rw-r--r-- 5,197 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
.\" Copyright 2002 Walter Harms (walter.harms@informatik.uni-oldenburg.de)
.\"
.\" %%%LICENSE_START(GPL_NOVERSION_ONELINE)
.\" Distributed under GPL
.\" %%%LICENSE_END
.\"
.\" Heavily based on glibc documentation
.\" Polished, added docs, removed glibc doc bug, 2002-07-20, aeb
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.\"
.\" Japanese Version Copyright (c) 2002 Akihiro MOTOKI all rights reserved.
.\" Translated Thu 05 Dec 2002 by Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
.\" Updated 2013-05-01, Akihiro MOTOKI <amotoki@gmail.com>
.\" Updated 2013-05-06, Akihiro MOTOKI <amotoki@gmail.com>
.\"
.TH MALLOC_HOOK 3 2010\-10\-13 GNU "Linux Programmer's Manual"
.SH 名前
__malloc_hook, __malloc_initialize_hook, __memalign_hook, __free_hook,
__realloc_hook, __after_morecore_hook \- malloc デバッグ用の変数
.SH 書式
.nf
\fB#include <malloc.h>\fP
.sp
\fBvoid *(*__malloc_hook)(size_t \fP\fIsize\fP\fB, const void *\fP\fIcaller\fP\fB);\fP
.sp
\fBvoid *(*__realloc_hook)(void *\fP\fIptr\fP\fB, size_t \fP\fIsize\fP\fB, const void *\fP\fIcaller\fP\fB);\fP
.sp
\fBvoid *(*__memalign_hook)(size_t \fP\fIalignment\fP\fB, size_t \fP\fIsize\fP\fB,\fP
\fB                         const void *\fP\fIcaller\fP\fB);\fP
.sp
\fBvoid (*__free_hook)(void *\fP\fIptr\fP\fB, const void *\fP\fIcaller\fP\fB);\fP
.sp
\fBvoid (*__malloc_initialize_hook)(void);\fP
.sp
\fBvoid (*__after_morecore_hook)(void);\fP
.fi
.SH 説明
GNU C ライブラリでは、適切なフック関数 (hook function) を指定することで \fBmalloc\fP(3), \fBrealloc\fP(3),
\fBfree\fP(3)  の動作を変更することができる。例えば、動的にメモリー割り当てを行う プログラムのデバッグにこれらのフックを使うことができる。
.LP
変数 \fB__malloc_initialize_hook\fP は malloc の実装が初期化される際に一度だけ呼ばれる関数へのポインターである。
この変数は書き換え可能 (weak) であり、アプリケーション内で 以下のような定義で上書きできる:
.nf

    void (*__malloc_initialize_hook)(void) = my_init_hook;

.fi
なお、関数 \fImy_init_hook\fP()  で全てのフックの初期化をすることができる。
.LP
\fB__malloc_hook\fP, \fB__realloc_hook\fP, \fB__memalign_hook\fP, \fB__free_hook\fP
で指される 4 つの関数は、各々 \fBmalloc\fP(3), \fBrealloc\fP(3), \fBmemalign\fP(3), \fBfree\fP(3)
とよく似たプロトタイプを持っているが、 一番最後の引き数 \fIcaller\fP をとる点が異なる。 引き数 \fIcaller\fP には、
\fBmalloc\fP(3)  などの呼び出し元 (caller) のアドレスが格納される。
.LP
変数 \fB__after_morecore_hook\fP は、領域の追加要求があり \fBsbrk\fP(2)
が呼ばれた後で毎回呼び出される関数へのポインターである。
.SH 準拠
これらの関数は GNU による拡張である。
.SH 注意
.\" https://bugzilla.redhat.com/show_bug.cgi?id=450187
.\" http://sourceware.org/bugzilla/show_bug.cgi?id=9957
マルチスレッドプログラムでは、 これらのフック関数の使用は安全ではなく、 今では非推奨である。 プログラマは、 "malloc" や "free"
のような関数を定義して公開して、 関連する関数を呼び出すようにすべきである。
.SH 例
これらの変数の使い方の簡単な例を以下に示す。
.sp
.nf
#include <stdio.h>
#include <malloc.h>

/* 使おうとするフックのプロトタイプ宣言 */
static void my_init_hook(void);
static void *my_malloc_hook(size_t, const void *);

/* 元々のフックを保存するための変数 */
static void *(*old_malloc_hook)(size_t, const void *);

/* C ライブラリから呼ばれる初期化フックを上書きする */
void (*__malloc_initialize_hook) (void) = my_init_hook;

static void
my_init_hook(void)
{
    old_malloc_hook = __malloc_hook;
    __malloc_hook = my_malloc_hook;
}

static void *
my_malloc_hook(size_t size, const void *caller)
{
    void *result;

    /* 元々のフックを全て戻す */
    __malloc_hook = old_malloc_hook;

    /* malloc の再帰的呼び出し */
    result = malloc(size);

    /* 現在設定されているフック (underlying hook) を保存する */
    old_malloc_hook = __malloc_hook;

    /* printf() は malloc() を呼び出す可能性があるので
        ここでもガードを行う (元々のフックのままにしておく) */
    printf("malloc(%u) called from %p returns %p\en",
            (unsigned int) size, caller, result);

    /* ユーザーが使おうとするフックを再設定する */
    __malloc_hook = my_malloc_hook;

    return result;
}
.fi
.SH 関連項目
\fBmallinfo\fP(3), \fBmalloc\fP(3), \fBmcheck\fP(3), \fBmtrace\fP(3)
.SH この文書について
この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.79 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man\-pages/ に書かれている。