計算機実験を行う環境 デバックツールの紹介
 

デバッグをする最もシンプルな方法は、printfとコメントアウトです。


GDBの使い方 

「C言語で malloc() を使った時のメモリ洩れを検出するツール "ElectricFence" の情報」

「計算機実験用マシン(PII/PIII/AthlonXP)」

「実行時の関数呼び出し回数, 関数の計算時間調査用ツール:gprof (mocaなら prof または gprof )
「Mathematica について」

「他人の作ったソースを読むときに役立つツール」

UNIXでの作業環境について: emcas のCモード環境

GDB の使い方

gdb: UNIX 上での代表的なデバッガーです。 gcc でコンパイルするときに -g オプションをつけておけば使用できます。 
参考URL: 使い方紹介ページ 日本語man
      WEBには、他にも詳細なページが他にもたくさんあるので自分で探してみてください


注意:
バグ取りがおわったあとでは、オプション -g を必ずはずしてコンパイルするようにしてください



「C言語で malloc() を使った時のメモリ洩れを検出するツール "ElectricFence" の情報」

angel, boo, lime にいれてあります. 使い方は簡単で,gcc で実行ファイルを作るときに "-L/usr/local/lib -lefence" のオプションを付けるだけです.

例として test.c をコンパイルする際に、 gdb と組み合わせてつかう方法を以下に引用しておきます. (注意:最終的な実験の際には, これらのオプションははずしてコンパイルすること.)
test.c
 #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;       /* バグ!! */

というふうに,メモリの allocate の失敗している箇所がわかります. 詳しくは "man efence" を見て下さい.
計算機実験用マシンについて:

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

実行時の関数呼び出し回数や, ここの関数の(のべ)計算時間などを調べるツールに 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 について

谷野研では、同時使用4ユーザまでで、各自のwindows PCで Matlab が使えます。 Matlabは,すでに組み込まれている数学関数や最適化・統計学のツールを,簡単なインターフェイスを操作して数値計算を行うソフトです.数値実験結果などをグラフィックスを用いて描くことも可能です.C言語などの他の言語と組み合わせることも可能ですが,基本的には,ちょっとした計算のためにわざわざ program を組むことなしに簡単に結果を知りたい時などに使うと便利です. マニュアルも学生室にあります.一度使ってみて下さい.
なお、ユーザインターフェースはよくないですが、Matlab ライセンスサーバgelgoog において

% Matlab

としても使えます.詳細は上記ページで.


他人の作ったソースを読むときに役立つツール

angel に入れてあります.

cflow : どの関数がどの関数を call しているか調べるコマンド

cscope : 変数とそれが使われている場所の一覧を表示するコマンド

より詳しくは man すること.

役立ちそうだという意見があれば他のマシンにもいれます.一度使ってみて下さい.