デバッグをする最もシンプルな方法は、printfとコメントアウトです。
gdb: UNIX 上での代表的なデバッガーです。 gcc でコンパイルするときに -g オプションをつけておけば使用できます。
参考URL: 使い方紹介ページ 日本語man
WEBには、他にも詳細なページが他にもたくさんあるので自分で探してみてください
注意:バグ取りがおわったあとでは、オプション -g を必ずはずしてコンパイルするようにしてください
「C言語で malloc() を使った時のメモリ洩れを検出するツール "ElectricFence" の情報」
angel, boo, lime にいれてあります. 使い方は簡単で,gcc で実行ファイルを作るときに "-L/usr/local/lib -lefence" のオプションを付けるだけです.
例として test.c をコンパイルする際に、 gdb と組み合わせてつかう方法を以下に引用しておきます. (注意:最終的な実験の際には, これらのオプションははずしてコンパイルすること.)
#include <stdio.h> #include <stdlib.h> int main(){ char *s; s = malloc( 100 ); s[ 101 ] = 0; /* バグ!! */ free( s ); printf( "ok\n" ); return 0; } |
% gcc test.c <-- 通常のコンパイル % a.out ok <-- 何事もなく終わってしまう ;-( % gcc test.c -L/usr/local/lib -lefence <-- そこで efence を使う % a.out Electric Fence 2.0.5 Copyright (C) 1987-1995 Bruce Perens. <-- 単なるメッセージ Segmentation fault <-- ちゃんとエラーにしてくれる さらに % gcc test.c -lefence -g <-- gdb 用のflag をつければ % gdb ./a.out (gdb) r Starting program: ./a.out Electric Fence 2.0.5 Copyright (C) 1987-1995 Bruce Perens. Program received signal SIGSEGV, Segmentation fault. 0x110f0 in main () at test.c:8 8 s[ 101 ] = 0; /* バグ!! */ |
angel は, 基本的にはアプリケーションサーバマシンですので, 大規模な数値実験等を行うのは, 他のマシンにしてください.
環境:
バックグラウンドで走らせるときは,必ず nice (execute a command at a low scheduling priority)等で,その process の priority(優先順位)を下げておいてください.
nice +num (走らせたいcommand)
num : コマンドのpriorityをあらわす数値 -20〜20. デフォルトは 0. 数値が大きいとpriority が下がる = 他のタスクに影響を与えない.
(詳しくは % man csh して nice の項を参照のこと.)
実行時の関数呼び出し回数や, ここの関数の(のべ)計算時間などを調べるツールに gprof というツールがあります(mocaなら prof または gprof ).
「この関数は1度きりしか実行しないはずなのに, 何度も実行されているらしい」 「他の同じようなプログラムに比べ, あるプログラムだけがやたら実行時間がかかる」
というときに使用してください. デバッグに役立ちます.
使い方
gcc でのコンパイル時に, オプションとして -pg を付けてコンパイルします.
そのあと, プログラムを実行すると
"(実行ファイル名).out"
というファイルができます.そして,
gprof (実行ファイル名)を実行すると, 実行した関数の一覧と関数の呼び出し回数, 関数ごとの計算時間がわかります.
granularity: each sample hit covers 4 byte(s) for 0.00% of 21.51 seconds % cumulative self self total time seconds seconds calls ms/call ms/call name 35.8 7.71 7.71 sor [1] 12.6 10.42 2.71 fncA [3] 9.5 12.46 2.04 fncAt [4] 8.7 14.33 1.87 1000 1.87 1.87 ending [6] 8.7 16.20 1.87 projection [5] 7.8 17.89 1.68 1 1681.64 1682.13 calc_energy [7] 3.9 18.73 0.84 1000 0.84 0.84 synchronous [8] 3.6 19.51 0.79 1000 0.79 0.79 synchronous_kosi [9] 1.1 19.75 0.24 matprint [10] 0.1 19.77 0.02 main [2] 0.1 19.79 0.02 2000 0.01 0.01 innerproduct [11] 0.0 19.80 0.01 3 2.93 3.58 makeProj [12] |
% Matlab
としても使えます.詳細は上記ページで.
angel に入れてあります.
cflow : どの関数がどの関数を call しているか調べるコマンド
cscope : 変数とそれが使われている場所の一覧を表示するコマンド
より詳しくは man すること.
役立ちそうだという意見があれば他のマシンにもいれます.一度使ってみて下さい.