Prog/debug/memory
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
#topicpath
/////////////////////////////////////////////////////////...
* 目次 [#d012f75f]
#contents();
/////////////////////////////////////////////////////////...
* バッファオーバーフロー [#buffer-overflow]
//=======================================================...
** -D_FORTIFY_SOURCE で検出する (GCC) [#fortify_source]
- GCC の "Automatic Fortification" 機能を使って、バッファ...
//-------------------------------------------------------...
*** 使い方 [#fortify_source-usage]
- 下記のオプションを付加してコンパイルする:
-O1 以上
-D_FORTIFY_SOURCE=1
- これにより、次の2つのタイミングでバッファオーバーフロー...
|~チェックするタイミング |~チェック内容 |
|コンパイル時 |コンパイル時にチェック可能な明...
|実行時 |上記以外のバッファオーバーフロ...
- チェックの強化
-D_FORTIFY_SOURCE=1
を
-D_FORTIFY_SOURCE=2
にすると、より厳しくチェエクされるようになる。
-- 一例として、format-string bug がランタイムに検出される...
--- printf, vfprintf, syslog などの関数が "%n" を含むフォ...
//-------------------------------------------------------...
*** チェックされる関数の一覧 [#fortify_source-check-target]
- 下記コマンドで一覧を取得出来る:
$ grep -r "_chk" /usr/include/ | sed 's/.*\(__.*chk\).*/...
//=======================================================...
** Mudflap (GCC) [#mudflap]
- Mudflap は
-- GCC4 に新規実装されたデバッグ補助機能(よって、GCC4以...
-- C/C++ に対応している
- 以下を検出出来る:
-- バッファオーバーフロー
-- メモリリーク
-- ヌルポインタ参照
-- その他、ポインタの誤使用
//-------------------------------------------------------...
*** 使い方 [#mudflap-usage]
+ ビルド
- ''-g'' ''-fmudflap'' を付与してコンパイルする
-- マルチスレッドプログラムの場合は、''-fmudflapth'' を付...
- ''-lmudflap'' を付けてリンクする
-- マルチスレッドプログラムの場合は、 ''-lmudflapth'' を...
- ビルド時に "mf-runtime.h が見つからない" 、或いは "lib...
+ 実行
-- 出来上がったプログラムを通常通り実行する。Mudflap によ...
-- 一時的気に Mudflap を無効にしたい場合は、環境変数 MUDF...
$ MUDFLAP_OPTIONS="-mode-nop" <target-test-program>
//=======================================================...
** -fstack-protector オプションによるスタックオーバーフロ...
- C/C++ コードを gcc のオプションとして ''-fstack-protect...
- SPP によりバッファオーバーフローが検出されるのは、実行...
- SPP によりバッファオーバーフローが検出されると、プログ...
- SPP よって検出出来るのは、以下:
-- バッファオーバーフローによるローカル変数(特にポインタ...
-- バッファオーバーフローによる return address や saved e...
- SPP は、スタックレイアウトの調整を行い、通常の gcc でコ...
- SPP と [[-D_FORTIFY_SOURCE=1>#fortify_source]] は併用し...
//=======================================================...
** AddressSanitizer でのバッファオーバーフローの検出 (cla...
- clang でコンパイルする際に、 "-g -fsanitize=address -fn...
/////////////////////////////////////////////////////////...
* メモリリーク [#memory-leak]
//=======================================================...
** valgrind [#valgrind]
//-------------------------------------------------------...
*** 使い方 [#valgrind-usage]
+ ビルドする
-- ''-g'' 又は ''--ggdb'' 付きにすること
-- 最適化は最大でも -O1 までにしておくこと
-- static link は避けること。これは、malloc などの関数を ...
+ 下記コマンドで実行する
$ valgrind --tool=memcheck --leak-check=yes <program-fil...
または
$ valgrind --leak-check=full --leak-resolution=high --sh...
//-------------------------------------------------------...
*** vgcore [#valgrind-vgcore]
- coredump した場合、 vgcore.<PID> という名前でファイルを...
- vgcore は、通常の core と同様、 gdb に読み込ませて解析...
//-------------------------------------------------------...
*** 特徴 [#valgrind-feature]
- スレッドセーフである
- プロセス全体の起動から終了までを調べることしか出来ない...
//-------------------------------------------------------...
*** valgrind で検出できないもの [#valgrind-undetect-errors]
- valgrind はスタック上に確保されたメモリ、data/bas 領域...
-- これを検出するには、Mudflap を使う必要がある。
//=======================================================...
** mtrace [#mtrace]
//-------------------------------------------------------...
*** 使い方 [#mtrace-usage]
+ ヘッダをインクルードする
#include <mcheck.h>
+ リークのテストを開始したい場所で ''mtrace()'' をコール
+ 終了したい場所で ''muntrace()'' をコールする
+ ''-g'' つきでコンパイル
+ 環境変数 ''MALLOC_TRACE'' を export する
# export MALLOC_TRACE=<log-file-name>
+ プログラムを実行する
- ${MALLOC_TRACE} に出力されたログの例
= Start
@ /usr/lib/libstdc++.so.5:(_Znwj+0x2e)[0x400b22fe] + 0x8...
@ /usr/lib/libstdc++.so.5:(_Znwj+0x2e)[0x400b22fe] + 0x8...
@ /usr/lib/libstdc++.so.5:(_ZdlPv+0x23)[0x400b0de3] - 0x...
@ /usr/lib/libstdc++.so.5:(_Znwj+0x2e)[0x400b22fe] + 0x8...
= End
~
ここで、
+ は new
- は delete
+ 以下の環境変数を指定することでメモリ領域の破壊などにつ...
export MALLOC_CHECK_=”値”
値は0〜3です。
MALLOC_CHECK_ = 0 何もしない
MALLOC_CHECK_ = 1 標準エラー出力に診断メッセージ表示
MALLOC_CHECK_ = 2 abort
MALLOC_CHECK_ = 3 1と2の両方
//-------------------------------------------------------...
*** 特徴 [#mtrace-feature]
- スレッドセーフではない
- ソース内でどこからどこの間でリークを調べたいかを指定で...
//=======================================================...
** 参考リンク [#links]
- [[メモリーリークの検出:mtrace , valgrind>http://blogs....
- [[メモリーリーク調査方法>http://www.nianyan.net/library...
終了行:
#topicpath
/////////////////////////////////////////////////////////...
* 目次 [#d012f75f]
#contents();
/////////////////////////////////////////////////////////...
* バッファオーバーフロー [#buffer-overflow]
//=======================================================...
** -D_FORTIFY_SOURCE で検出する (GCC) [#fortify_source]
- GCC の "Automatic Fortification" 機能を使って、バッファ...
//-------------------------------------------------------...
*** 使い方 [#fortify_source-usage]
- 下記のオプションを付加してコンパイルする:
-O1 以上
-D_FORTIFY_SOURCE=1
- これにより、次の2つのタイミングでバッファオーバーフロー...
|~チェックするタイミング |~チェック内容 |
|コンパイル時 |コンパイル時にチェック可能な明...
|実行時 |上記以外のバッファオーバーフロ...
- チェックの強化
-D_FORTIFY_SOURCE=1
を
-D_FORTIFY_SOURCE=2
にすると、より厳しくチェエクされるようになる。
-- 一例として、format-string bug がランタイムに検出される...
--- printf, vfprintf, syslog などの関数が "%n" を含むフォ...
//-------------------------------------------------------...
*** チェックされる関数の一覧 [#fortify_source-check-target]
- 下記コマンドで一覧を取得出来る:
$ grep -r "_chk" /usr/include/ | sed 's/.*\(__.*chk\).*/...
//=======================================================...
** Mudflap (GCC) [#mudflap]
- Mudflap は
-- GCC4 に新規実装されたデバッグ補助機能(よって、GCC4以...
-- C/C++ に対応している
- 以下を検出出来る:
-- バッファオーバーフロー
-- メモリリーク
-- ヌルポインタ参照
-- その他、ポインタの誤使用
//-------------------------------------------------------...
*** 使い方 [#mudflap-usage]
+ ビルド
- ''-g'' ''-fmudflap'' を付与してコンパイルする
-- マルチスレッドプログラムの場合は、''-fmudflapth'' を付...
- ''-lmudflap'' を付けてリンクする
-- マルチスレッドプログラムの場合は、 ''-lmudflapth'' を...
- ビルド時に "mf-runtime.h が見つからない" 、或いは "lib...
+ 実行
-- 出来上がったプログラムを通常通り実行する。Mudflap によ...
-- 一時的気に Mudflap を無効にしたい場合は、環境変数 MUDF...
$ MUDFLAP_OPTIONS="-mode-nop" <target-test-program>
//=======================================================...
** -fstack-protector オプションによるスタックオーバーフロ...
- C/C++ コードを gcc のオプションとして ''-fstack-protect...
- SPP によりバッファオーバーフローが検出されるのは、実行...
- SPP によりバッファオーバーフローが検出されると、プログ...
- SPP よって検出出来るのは、以下:
-- バッファオーバーフローによるローカル変数(特にポインタ...
-- バッファオーバーフローによる return address や saved e...
- SPP は、スタックレイアウトの調整を行い、通常の gcc でコ...
- SPP と [[-D_FORTIFY_SOURCE=1>#fortify_source]] は併用し...
//=======================================================...
** AddressSanitizer でのバッファオーバーフローの検出 (cla...
- clang でコンパイルする際に、 "-g -fsanitize=address -fn...
/////////////////////////////////////////////////////////...
* メモリリーク [#memory-leak]
//=======================================================...
** valgrind [#valgrind]
//-------------------------------------------------------...
*** 使い方 [#valgrind-usage]
+ ビルドする
-- ''-g'' 又は ''--ggdb'' 付きにすること
-- 最適化は最大でも -O1 までにしておくこと
-- static link は避けること。これは、malloc などの関数を ...
+ 下記コマンドで実行する
$ valgrind --tool=memcheck --leak-check=yes <program-fil...
または
$ valgrind --leak-check=full --leak-resolution=high --sh...
//-------------------------------------------------------...
*** vgcore [#valgrind-vgcore]
- coredump した場合、 vgcore.<PID> という名前でファイルを...
- vgcore は、通常の core と同様、 gdb に読み込ませて解析...
//-------------------------------------------------------...
*** 特徴 [#valgrind-feature]
- スレッドセーフである
- プロセス全体の起動から終了までを調べることしか出来ない...
//-------------------------------------------------------...
*** valgrind で検出できないもの [#valgrind-undetect-errors]
- valgrind はスタック上に確保されたメモリ、data/bas 領域...
-- これを検出するには、Mudflap を使う必要がある。
//=======================================================...
** mtrace [#mtrace]
//-------------------------------------------------------...
*** 使い方 [#mtrace-usage]
+ ヘッダをインクルードする
#include <mcheck.h>
+ リークのテストを開始したい場所で ''mtrace()'' をコール
+ 終了したい場所で ''muntrace()'' をコールする
+ ''-g'' つきでコンパイル
+ 環境変数 ''MALLOC_TRACE'' を export する
# export MALLOC_TRACE=<log-file-name>
+ プログラムを実行する
- ${MALLOC_TRACE} に出力されたログの例
= Start
@ /usr/lib/libstdc++.so.5:(_Znwj+0x2e)[0x400b22fe] + 0x8...
@ /usr/lib/libstdc++.so.5:(_Znwj+0x2e)[0x400b22fe] + 0x8...
@ /usr/lib/libstdc++.so.5:(_ZdlPv+0x23)[0x400b0de3] - 0x...
@ /usr/lib/libstdc++.so.5:(_Znwj+0x2e)[0x400b22fe] + 0x8...
= End
~
ここで、
+ は new
- は delete
+ 以下の環境変数を指定することでメモリ領域の破壊などにつ...
export MALLOC_CHECK_=”値”
値は0〜3です。
MALLOC_CHECK_ = 0 何もしない
MALLOC_CHECK_ = 1 標準エラー出力に診断メッセージ表示
MALLOC_CHECK_ = 2 abort
MALLOC_CHECK_ = 3 1と2の両方
//-------------------------------------------------------...
*** 特徴 [#mtrace-feature]
- スレッドセーフではない
- ソース内でどこからどこの間でリークを調べたいかを指定で...
//=======================================================...
** 参考リンク [#links]
- [[メモリーリークの検出:mtrace , valgrind>http://blogs....
- [[メモリーリーク調査方法>http://www.nianyan.net/library...
ページ名: