ここは個人的な備忘録です。テキトーかつ適当が目標。

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

メモ.リリークの調査をするときのメモ。

メモリリーク検出: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つ使用します。MEMWATCHYet 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

スポンサーサイト
よく計算を流して放置しているので、そのTipsを。

ログアウト後も計算を続行させるには
$ 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

http://x68000.q-e-d.net/~68user/unix/pickup?gccから引用


-E プリプロセス後終了。コンパイルをしない。

プリプロセッサの出力を標準出力に書き出す。#include や #define などがプリプロセッサによって処理される。#ifdef ~ #endif が多くて読みにくいソースは -E オプションを使うとよい。なお、インクルードファイルの読み込み部分で多くの空行が挿入されるので、cat コマンドの -s オプション (連続する空行を 1行にまとめる) を使って

% gcc -E foo.c | cat -s | less


などとするのがお勧め。



cat コマンドの -s オプションはしらなかった。
C言語のソースファイル内で、コンパイラの判別をするときのメモ。

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]
gmpをIntelコンパイラで再コンパイルしてみた。

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


今日は時間切れでここで終了

ここを参考にしました
互換性保持のためのコンパイラー・オプション
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。