メモ.リリークの調査をするときのメモ。
メモリリーク検出:mtrace編 より要約
gccの場合、mtraceというツールが使える。
使用手順は
1.環境変数:MALLOC_TRACE=[ログファイル名]を設定
2.プログラム改造:関数 mtrace()、 muntrace() を挿入。(この間のmalloc, freeがカウントされる)
3.コンパイル: -g オプションをつける。(gcc -g hoge.c)
4.ログ解析:mtrace [プログラム名] [ログファイル名]
簡易mallocデバッグメモには、mallocがらみの環境変数の解説等が載っている
「Linuxのデバッグ手法をマスターする」では各種ツールの有効な利用方法がまとめられている。
本稿では、Linuxプログラムをデバッグするための4通りのシナリオを紹介します。シナリオ1では、メモリー割り当ての問題を扱うサンプル・プログラムを2つ使用します。MEMWATCHとYet Another Malloc Debugger (YAMD) というツールを使ってデバッグを行います。シナリオ2では、Linuxのstraceユーティリティーを使用します。このユーティリティーでは、システム・コールとシグナルをトレースすることで、プログラムの問題箇所を検出することができます。シナリオ3では、LinuxカーネルのOops機能を使って、セグメンテーション障害を解決するとともに、同じ問題をGNUデバッガー (gdb) で解決するために、カーネル・ソース・レベル・デバッガー (kgdb) をセットアップする方法を紹介します。kgdbプログラムは、シリアル接続経由でのLinuxカーネル・リモートgdbです。シナリオ4では、Linuxで利用できるmagic key sequenceを使って、ハングアップを起こしているコンポーネントについての情報を表示します。
目次: 一般的なデバッグ方針 シナリオ1: メモリー・デバッグ・ツール MEMWATCH YAMD Electric Fence シナリオ2: straceの利用 シナリオ3: gdbおよびOopsの利用 kgdb kgdbを使ってカーネルの問題をデバッグする Oops分析 kdb シナリオ4: magic key sequenceを使ってバック・トレースを行う 結論 参考文献 著者について 記事の評価
メモリーとカーネルに関する便利なデバッグ・ツール
Linuxでデバッグ・ツールを使ってユーザー・スペースやカーネルの問題を追跡するには、いろいろな方法があります。以下に列挙したツールや手法を使ってソース・コードをビルドし、デバッグします。ユーザー・スペース用のツール:
- メモリー・ツール: MEMWATCH、YAMD
- strace
- GNUデバッガー (gdb)
- Magic key sequence
カーネル用のツール:
- カーネル・ソース・レベル・デバッガー (kgdb)
- 内蔵のカーネル・デバッガー (kdb)
- Oops
ログアウト後も計算を続行させるには
$ nohup a.out
と起動すればOK。
Programing - プログラムの素人が不思議に思ったことによると、
普通に起動してしまったプロセスをログアウト後にも計算続行させるためには
$ jobs
$ disown %1
などとすればOK。
「数値計算プログラムのデーモン化」の話が興味深かった。
プログラムを組んでいたとき、自分の環境ではファイルサイズの最大値が 2GB のところで引っかかってしまった。
OSはVine Linux。
$ uname -r
2.6.25-7
という環境。
Programing - プログラムの素人が不思議に思ったことによると
1.9 2G以上のファイルが書き込めない場合の解決策
書き込めない原因はいくつか考えられます。僕の場合は32bitのファイルポインタが原因でした。
32bitのファイルポインタ(C言語)(プログラミング/C,C++/2GBより大きなファイルの扱い)
容量制限(ディスクquota)()
リソース制限で最大ファイルサイズに制限(PMA)(http://www.itmedia.co.jp/help/tips/linux/l0652.html)
小さなブロックサイズ(ファイルシステム)(http://blog.ohgaki.net/ext3-2tb-16gb)
大規模ファイルを扱うには - 2Gの壁とLSF仕様
によると、LSFを用いればファイルサイズ2GB越えが可能とのこと。
■gccで大規模ファイル対応のコンパイル
最近のgcc(glibc)ではLSF使用に対応しています。よって、プログラムを2GB以上のファイルに対応させる場合は、makefile等で、
CPPFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
等と書いてやればOKです。
Google検索:linux XFS
-E プリプロセス後終了。コンパイルをしない。
プリプロセッサの出力を標準出力に書き出す。#include や #define などがプリプロセッサによって処理される。#ifdef 〜 #endif が多くて読みにくいソースは -E オプションを使うとよい。なお、インクルードファイルの読み込み部分で多くの空行が挿入されるので、cat コマンドの -s オプション (連続する空行を 1行にまとめる) を使って% gcc -E foo.c | cat -s | less
などとするのがお勧め。
cat コマンドの -s オプションはしらなかった。
gccのときは
#ifdef __GNUC__
#endif
でくくり、iccのときは
#ifdef __INTEL_COMPILER
#endif
でくくる。
gccのはすぐ見つかったが、意外にインテルコンパイラのはすぐ出てこなかったのでメモ。
あと、cross platform developmentに環境の判別の詳しいメモが。
gcc、Visual C++、Borland C++
UNIX、Windows、Cygwin
の判別+これらのバージョンの判別
参考uri
google code search [ifdef intel icc]
Vine Linux
以下の環境変数を設定して
CC=icc
CFLAGS=-cxxlib-gcc -O3 -fast -unroll-aggressive -mtune=core2 -msse3
$ ./configure ABI=32 --host=core2
$ make
をやった。が、これではmake checkが通らなかった。
ipo: warning #11043: unresolved mp_trace_base
Referenced in /tmp/ipo_iccd2LSae.o
ipo: warning #11043: unresolved tests_start
Referenced in /tmp/ipo_iccd2LSae.o
ipo: warning #11043: unresolved __gmpn_random
Referenced in /tmp/ipo_iccd2LSae.o
ipo: warning #11043: unresolved ref_bswap_limb
Referenced in /tmp/ipo_iccd2LSae.o
ipo: warning #11043: unresolved tests_end
Referenced in /tmp/ipo_iccd2LSae.o
ipo: warning #11043: unresolved mpn_trace
Referenced in /tmp/ipo_iccd2LSae.o
ipo: remark #11001: performing single-file optimizations
ipo: remark #11006: generating assembly file /tmp/iccKBHHXKas_.s
/tmp/ipo_iccd2LSae.o: In function `main':
ipo_iccd2LSae.c:(.text+0x21): undefined reference to `tests_start'
ipo_iccd2LSae.c:(.text+0x27): undefined reference to `mp_trace_base'
ipo_iccd2LSae.c:(.text+0x3b): undefined reference to `__gmpn_random'
ipo_iccd2LSae.c:(.text+0x44): undefined reference to `ref_bswap_limb'
ipo_iccd2LSae.c:(.text+0x7a): undefined reference to `tests_end'
ipo_iccd2LSae.c:(.text+0x9d): undefined reference to `mpn_trace'
ipo_iccd2LSae.c:(.text+0xae): undefined reference to `mpn_trace'
ipo_iccd2LSae.c:(.text+0xbf): undefined reference to `mpn_trace'
make[4]: *** [t-bswap] エラー 1
make[4]: ディレクトリ `/home/tekito/program/gmp-4.2.2/tests' から出ます
make[3]: *** [check-am] エラー 2
make[3]: ディレクトリ `/home/tekito/program/gmp-4.2.2/tests' から出ます
make[2]: *** [check-recursive] エラー 1
make[2]: ディレクトリ `/home/tekito/program/gmp-4.2.2/tests' から出ます
make[1]: *** [check-recursive] エラー 1
make[1]: ディレクトリ `/home/tekito/program/gmp-4.2.2' から出ます
make: *** [check] エラー 2
今日は時間切れでここで終了
ここを参考にしました
互換性保持のためのコンパイラー・オプション









![Microsoft Office Professional 2010 アカデミック [パッケージ]](http://ecx.images-amazon.com/images/I/51Gi6Wt1MNL._SL160_.jpg)
![Microsoft Office Home and Business 2010 通常版 [パッケージ]](http://ecx.images-amazon.com/images/I/41C7EBZcgtL._SL160_.jpg)




