DEBUG/メモリリークなどを探すツール・Electric Fence
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
#navi(../)
* メモリリークなどを探すツール・Electric Fenceを使ってみ...
mallocのフリー忘れやサイズ0のメモリアロケートなどを検出し...
以下にElectric Fenceの使用例を記します。
使用したOSはCentOS5のx86_64になります。
#contents
#htmlinsertpcsp(c-top.html,c-sp.html)
* 関連資料・関連記事 [#u9c171aa]
-[[EFBIG(errno=27)対処方法>DEBUG/EFBIG(errno=27)対処方法]]
-[[メモリリークなどを探すツール・Electric Fence>DEBUG/メ...
-[[errnoエラー番号に対する説明を表示する方法・strerror>DE...
-[[C言語ソースコードの行番号を表示する方法>DEBUG/ソースコ...
-[[Cプログラムが異常終了したときにコアダンプを出力するよ...
* Electric Fenceのインストール [#b4ede7fe]
Electric Fenceは以下のパッケージになります。
-x86_64版
ElectricFence.x86_64 : メモリ割り当ての侵略を検出するデ...
-i386版
ElectricFence.i386 : メモリ割り当ての侵略を検出するデバ...
ともに以下のコマンドでインストールすることができます。~
rootユーザでインストールしてください。
yum -y install ElectricFence
* Electric Fenceを使ってみる [#dbb77ba5]
早速、Electric Fenceを使ってみます。
** Electric Fenceの使う順序 [#s62cbc87]
以下の手順でElectric Fenceを使うことができます。
+ デバッグするプログラムを準備
+ Electric Fenceように環境変数を設定(検出項目の設定)
+ 環境変数LD_PRELOADにlibefence.soを設定
+ デバッグプログラムの実行
** バッファーオーバーフローを試す [#tee8ceef]
使用したバッファーオーバーフローのCソースは以下の通りです。
#ref(over.c)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *c;
c = malloc(4);
c[4] = 0;
free(c);
exit(0);
}
上記のプログラムはバッファーオーバーフローしていますが、...
Electric Fenceを使って実行してみます。
+ プログラムを準備(gccでコンパイルし実行ファイルoverを出...
$ gcc -g -O0 over.c -o over
+ オーバーフロー(オーバーラン)を調べる環境変数EF_PROTECT_...
$ export EF_PROTECT_BELOW=0
+ EF_ALIGNMENTに0を設定
$ export EF_ALIGNMENT=0
+ libefence.soを環境変数LD_PRELOADに設定
--x86_64
$ export LD_PRELOAD=/usr/lib64/libefence.so
--i386
$ export LD_PRELOAD=/usr/lib/libefence.so
+ プログラムを実行
$ ./over
Electric Fence 2.2.0 Copyright (C) 1987-1999 Bruce Per...
セグメンテーション違反です (core dumped)
上記のようにElectric Fenceを使うとセグメンテーション違反...
出力されたcore dumpをgdbで調べるとバッファーオーバーフロ...
(Electric Fenceを使用した状態でgdbを使うとセグメンテーシ...
$ unset LD_PRELOAD
$ gdb -c core.5705 over
GNU gdb (GDB) CentOS (7.0.1-42.el5.centos.1)
Copyright (C) 2009 Free Software Foundation, Inc.
<snip>
warning: no loadable sections found in added symbol-file...
Core was generated by `./over'.
Program terminated with signal 11, Segmentation fault.
#0 0x0000000000400546 in main () at over.c:8
8 c[4] = 0;
** バッファーアンダーフローを試す [#z924d78d]
アンダーフローも上記のオーバーフロート同様の手順ですが、E...
使用したバッファーアンダーフローのCソースは以下の通りです。
#ref(under.c)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *c;
c = malloc(4);
c[-1] = 0;
free(c);
exit(0);
}
上記のプログラムはバッファーアンダーフローしていますが、...
Electric Fenceを使って実行してみます。
+ プログラムを準備(gccでコンパイルし実行ファイルunderを出...
$ gcc -g -O0 under.c -o under
+ アンダーフロー(アンダーラン)を調べる環境変数EF_PROTECT_...
$ export EF_PROTECT_BELOW=1
+ libefence.soを環境変数LD_PRELOADに設定
--x86_64
$ export LD_PRELOAD=/usr/lib64/libefence.so
--i386
$ export LD_PRELOAD=/usr/lib/libefence.so
+ プログラムを実行
$ ./under
Electric Fence 2.2.0 Copyright (C) 1987-1999 Bruce Per...
セグメンテーション違反です (core dumped)
上記のようにElectric Fenceを使うとセグメンテーション違反...
出力されたcore dumpをgdbで調べるとバッファーアンダーフロ...
(Electric Fenceを使用した状態でgdbを使うとセグメンテーシ...
$ unset LD_PRELOAD
$ gdb -c core.5757 under
GNU gdb (GDB) CentOS (7.0.1-42.el5.centos.1)
Copyright (C) 2009 Free Software Foundation, Inc.
<snip>
warning: no loadable sections found in added symbol-file...
Core was generated by `./under'.
Program terminated with signal 11, Segmentation fault.
#0 0x0000000000400546 in main () at under.c:8
8 c[-1] = 0;
** サイズ0のmallocを検出する [#gc67e5d9]
サイズ0をmallocをするサンプルソースを準備しました。
#ref(zero.c)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *c;
c = malloc(0);
free(c);
exit(0);
}
+ プログラムを準備(gccでコンパイルし実行ファイルzeroを出...
$ gcc -g -O0 zero.c -o zero
+ libefence.soを環境変数LD_PRELOADに設定
--x86_64
$ export LD_PRELOAD=/usr/lib64/libefence.so
--i386
$ export LD_PRELOAD=/usr/lib/libefence.so
+ プログラムを実行
$ ./zero
Electric Fence 2.2.0 Copyright (C) 1987-1999 Bruce Per...
ElectricFence Aborting: Allocating 0 bytes, probably a b...
不正な命令です (core dumped)
上記のようにElectric Fenceを使うと「不正な命令です (core ...
出力されたcore dumpをgdbで調べるとバッファーアンダーフロ...
(Electric Fenceを使用した状態でgdbを使うとセグメンテーシ...
$ unset LD_PRELOAD
$ gdb -c core.5845 zero
GNU gdb (GDB) CentOS (7.0.1-42.el5.centos.1)
Copyright (C) 2009 Free Software Foundation, Inc.
<snip>
warning: no loadable sections found in added symbol-file...
Core was generated by `./zero'.
Program terminated with signal 4, Illegal instruction.
#0 0x0000003dbd630717 in kill () from /lib64/libc.so.6
(gdb) bt
#0 0x0000003dbd630717 in kill () from /lib64/libc.so.6
#1 0x00002b16158e7005 in ?? () from /usr/lib64/libefenc...
#2 0x00002b16158e755d in EF_Abort () from /usr/lib64/li...
#3 0x00002b16158e6bfe in memalign () from /usr/lib64/li...
#4 0x000000000040053a in main () at zero.c:7
bt(バックトレース)コマンドを実行するとzero.cの7行目(c = m...
サイズ0のチェックを行わない場合は、以環境変数EF_ALLOW_MAL...
$ export EF_ALLOW_MALLOC_0=1
* その他環境変数 [#rc7beca9]
Electric Fenceの環境変数に関しては、manコマンドで調べるこ...
man libefence
#htmlinsertpcsp(c-btm.html,c-sp.html)
終了行:
#navi(../)
* メモリリークなどを探すツール・Electric Fenceを使ってみ...
mallocのフリー忘れやサイズ0のメモリアロケートなどを検出し...
以下にElectric Fenceの使用例を記します。
使用したOSはCentOS5のx86_64になります。
#contents
#htmlinsertpcsp(c-top.html,c-sp.html)
* 関連資料・関連記事 [#u9c171aa]
-[[EFBIG(errno=27)対処方法>DEBUG/EFBIG(errno=27)対処方法]]
-[[メモリリークなどを探すツール・Electric Fence>DEBUG/メ...
-[[errnoエラー番号に対する説明を表示する方法・strerror>DE...
-[[C言語ソースコードの行番号を表示する方法>DEBUG/ソースコ...
-[[Cプログラムが異常終了したときにコアダンプを出力するよ...
* Electric Fenceのインストール [#b4ede7fe]
Electric Fenceは以下のパッケージになります。
-x86_64版
ElectricFence.x86_64 : メモリ割り当ての侵略を検出するデ...
-i386版
ElectricFence.i386 : メモリ割り当ての侵略を検出するデバ...
ともに以下のコマンドでインストールすることができます。~
rootユーザでインストールしてください。
yum -y install ElectricFence
* Electric Fenceを使ってみる [#dbb77ba5]
早速、Electric Fenceを使ってみます。
** Electric Fenceの使う順序 [#s62cbc87]
以下の手順でElectric Fenceを使うことができます。
+ デバッグするプログラムを準備
+ Electric Fenceように環境変数を設定(検出項目の設定)
+ 環境変数LD_PRELOADにlibefence.soを設定
+ デバッグプログラムの実行
** バッファーオーバーフローを試す [#tee8ceef]
使用したバッファーオーバーフローのCソースは以下の通りです。
#ref(over.c)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *c;
c = malloc(4);
c[4] = 0;
free(c);
exit(0);
}
上記のプログラムはバッファーオーバーフローしていますが、...
Electric Fenceを使って実行してみます。
+ プログラムを準備(gccでコンパイルし実行ファイルoverを出...
$ gcc -g -O0 over.c -o over
+ オーバーフロー(オーバーラン)を調べる環境変数EF_PROTECT_...
$ export EF_PROTECT_BELOW=0
+ EF_ALIGNMENTに0を設定
$ export EF_ALIGNMENT=0
+ libefence.soを環境変数LD_PRELOADに設定
--x86_64
$ export LD_PRELOAD=/usr/lib64/libefence.so
--i386
$ export LD_PRELOAD=/usr/lib/libefence.so
+ プログラムを実行
$ ./over
Electric Fence 2.2.0 Copyright (C) 1987-1999 Bruce Per...
セグメンテーション違反です (core dumped)
上記のようにElectric Fenceを使うとセグメンテーション違反...
出力されたcore dumpをgdbで調べるとバッファーオーバーフロ...
(Electric Fenceを使用した状態でgdbを使うとセグメンテーシ...
$ unset LD_PRELOAD
$ gdb -c core.5705 over
GNU gdb (GDB) CentOS (7.0.1-42.el5.centos.1)
Copyright (C) 2009 Free Software Foundation, Inc.
<snip>
warning: no loadable sections found in added symbol-file...
Core was generated by `./over'.
Program terminated with signal 11, Segmentation fault.
#0 0x0000000000400546 in main () at over.c:8
8 c[4] = 0;
** バッファーアンダーフローを試す [#z924d78d]
アンダーフローも上記のオーバーフロート同様の手順ですが、E...
使用したバッファーアンダーフローのCソースは以下の通りです。
#ref(under.c)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *c;
c = malloc(4);
c[-1] = 0;
free(c);
exit(0);
}
上記のプログラムはバッファーアンダーフローしていますが、...
Electric Fenceを使って実行してみます。
+ プログラムを準備(gccでコンパイルし実行ファイルunderを出...
$ gcc -g -O0 under.c -o under
+ アンダーフロー(アンダーラン)を調べる環境変数EF_PROTECT_...
$ export EF_PROTECT_BELOW=1
+ libefence.soを環境変数LD_PRELOADに設定
--x86_64
$ export LD_PRELOAD=/usr/lib64/libefence.so
--i386
$ export LD_PRELOAD=/usr/lib/libefence.so
+ プログラムを実行
$ ./under
Electric Fence 2.2.0 Copyright (C) 1987-1999 Bruce Per...
セグメンテーション違反です (core dumped)
上記のようにElectric Fenceを使うとセグメンテーション違反...
出力されたcore dumpをgdbで調べるとバッファーアンダーフロ...
(Electric Fenceを使用した状態でgdbを使うとセグメンテーシ...
$ unset LD_PRELOAD
$ gdb -c core.5757 under
GNU gdb (GDB) CentOS (7.0.1-42.el5.centos.1)
Copyright (C) 2009 Free Software Foundation, Inc.
<snip>
warning: no loadable sections found in added symbol-file...
Core was generated by `./under'.
Program terminated with signal 11, Segmentation fault.
#0 0x0000000000400546 in main () at under.c:8
8 c[-1] = 0;
** サイズ0のmallocを検出する [#gc67e5d9]
サイズ0をmallocをするサンプルソースを準備しました。
#ref(zero.c)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *c;
c = malloc(0);
free(c);
exit(0);
}
+ プログラムを準備(gccでコンパイルし実行ファイルzeroを出...
$ gcc -g -O0 zero.c -o zero
+ libefence.soを環境変数LD_PRELOADに設定
--x86_64
$ export LD_PRELOAD=/usr/lib64/libefence.so
--i386
$ export LD_PRELOAD=/usr/lib/libefence.so
+ プログラムを実行
$ ./zero
Electric Fence 2.2.0 Copyright (C) 1987-1999 Bruce Per...
ElectricFence Aborting: Allocating 0 bytes, probably a b...
不正な命令です (core dumped)
上記のようにElectric Fenceを使うと「不正な命令です (core ...
出力されたcore dumpをgdbで調べるとバッファーアンダーフロ...
(Electric Fenceを使用した状態でgdbを使うとセグメンテーシ...
$ unset LD_PRELOAD
$ gdb -c core.5845 zero
GNU gdb (GDB) CentOS (7.0.1-42.el5.centos.1)
Copyright (C) 2009 Free Software Foundation, Inc.
<snip>
warning: no loadable sections found in added symbol-file...
Core was generated by `./zero'.
Program terminated with signal 4, Illegal instruction.
#0 0x0000003dbd630717 in kill () from /lib64/libc.so.6
(gdb) bt
#0 0x0000003dbd630717 in kill () from /lib64/libc.so.6
#1 0x00002b16158e7005 in ?? () from /usr/lib64/libefenc...
#2 0x00002b16158e755d in EF_Abort () from /usr/lib64/li...
#3 0x00002b16158e6bfe in memalign () from /usr/lib64/li...
#4 0x000000000040053a in main () at zero.c:7
bt(バックトレース)コマンドを実行するとzero.cの7行目(c = m...
サイズ0のチェックを行わない場合は、以環境変数EF_ALLOW_MAL...
$ export EF_ALLOW_MALLOC_0=1
* その他環境変数 [#rc7beca9]
Electric Fenceの環境変数に関しては、manコマンドで調べるこ...
man libefence
#htmlinsertpcsp(c-btm.html,c-sp.html)
ページ名: