Informatik-Wiki
■mcheck()関数
最終更新:
匿名ユーザー
-
view
#blognavi
#blognavi
ヒープ領域の一貫性をチェックする他の方法としてmcheck()関数の使用があります。
typedef void (*mcheckCallback)(enum mcheck_status status); void mcheck(mcheckCallback cb);
mcheck()がコールされると、malloc()は獲得したたメモリ領域の前後に予め定められた
バイトシーケンスを配置して領域の境界の前後が不当に上書きされるかどうかの状態変
化を監視出来る様にします。free()はこれ等のシグニチャを捜し、破壊されている事を
検知すると、free()はcbパラメータで指定された関数をコールします。もしcbがNULLで
あれば、その代わりにプログラムからexitします。mcheck()をリンクしたプログラムは
free()のタイミングでgdbを通じてどのメモリ領域が壊れたかを示す事が出来ます。し
かし、memcheck()ではメモリ破壊の発生した場所をピンポイントで特定する事は出来ま
せん。この問題を解決するにはプログラムフローを理解しているプログラマの助けが
必要です。mcheck()のリンクと実行例を以下に示します。
バイトシーケンスを配置して領域の境界の前後が不当に上書きされるかどうかの状態変
化を監視出来る様にします。free()はこれ等のシグニチャを捜し、破壊されている事を
検知すると、free()はcbパラメータで指定された関数をコールします。もしcbがNULLで
あれば、その代わりにプログラムからexitします。mcheck()をリンクしたプログラムは
free()のタイミングでgdbを通じてどのメモリ領域が壊れたかを示す事が出来ます。し
かし、memcheck()ではメモリ破壊の発生した場所をピンポイントで特定する事は出来ま
せん。この問題を解決するにはプログラムフローを理解しているプログラマの助けが
必要です。mcheck()のリンクと実行例を以下に示します。
gcc -ggdb -o broken broken.c -lmcheck ./broken プログラム実行結果表示 memory clobbered past end of allocated block
mcheck()だけでは余り頻繁にエラー表示やexitをしないので、エラー箇所をピンポイント
で突き止める事は出来ません。これを実現するにはmcheck()をリンクしたプログラムを
gdb上で実行して問題を認知してabort()する必要があります。そのためにはプログラムで
最初にmalloc()を呼出す前に、gdbからcall mcheck()もしくはcall mcheck(1)を実行する
だけです。(特記事項:gdbからのmcheck()呼出しを行なうのに、実行プログラムがmcheck
ライブラリとリンクしている必要はありません!)
で突き止める事は出来ません。これを実現するにはmcheck()をリンクしたプログラムを
gdb上で実行して問題を認知してabort()する必要があります。そのためにはプログラムで
最初にmalloc()を呼出す前に、gdbからcall mcheck()もしくはcall mcheck(1)を実行する
だけです。(特記事項:gdbからのmcheck()呼出しを行なうのに、実行プログラムがmcheck
ライブラリとリンクしている必要はありません!)
以下に実行例を示します。
gdb broken . . . (gdb) break main Breakpoint 1 at 0x80483f4: file broken.c, line 14. (gdb) command 1 Type commands for when breakpoint 1 is hit, one per line. End with a line saying just "end". >call mcheck(&abort) >continue >end (gdb) run Starting program: /usr/src/myprogram/broken Breakpoint 1, main() at broken.c:14 47 return broken(); $1 = 0 1: 12345 Program received signal SIGABORT, Aborted. 0x00e12c32 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2 (gdb) where #0 0x00e12c32 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2 #1 0x0072c969 in rase () from /lib/tls/libc.so.6 #2 0x0072e322 in abort () from /lib/tls/libc.so.6 #3 0x007792c4 in freehook () from /lib/tls/libc.so.6 #4 0x00774fa5 in free () from /lib/tls/libc.so.6 #5 0x0804842b in broken () at broken.c:17 #6 0x08048520 in main () at broken.c:47
mcheck()はmalloc()されたメモリ領域関連のオーバーフローもしくはアンダーランのみ
を検知します。ローカルもしくはグローバル変数のエラーは検知しません。
を検知します。ローカルもしくはグローバル変数のエラーは検知しません。
参考文献
(リスト部分を引用) Linux Application Development -second edition Author: Michael K. Johnson, Erik W. Troan (c)2005 Pearson Education, Inc. ISBN: 0-321-21914-7
カテゴリ: [メモリ管理] - &trackback() - 2006年03月15日 02:00:47
#blognavi
