.\" 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 .\" Updated 2013-05-01, Akihiro MOTOKI .\" Updated 2013-05-06, Akihiro MOTOKI .\" .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 \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 #include /* 使おうとするフックのプロトタイプ宣言 */ 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/ に書かれている。