FreeBSD プログラマのためのソフト紹介

Last Update (1999/10/19 09:28:50)

ミラーサイト [www.ceres.dti.ne.jp] [yk.rim.or.jp]

[ホームページ] [日記] [読んでいる日記] [秋葉原価格] [FreeBSD] [FreeBSD LINK] [検索]

プログラマのためのソフト紹介

gdb (GNU DeBugger) (システム標準)

デバッグの友。これなしでデバッグを行うことは困難だ。 (printfデバッグという手もあるが、printfを埋め込んで再コンパイルするのは面倒なものだ。) gdbの詳しい説明はマニュアルにに譲るが、以下は使っていて便利なコマンド一覧。 なお、gdbは mule / emacs から M-x gdb として利用すると、ソースファイルを自動で開いてくれたり、ブレークポイントのあるソース行位置まで自動ジャンプしてくれたりするので便利。

gdbは、最初に ~/.gdbinit という設定ファイルを読み込むので、良く使うコマンドは define 〜 end でマクロにしておくと便利かも。

gdb [filename] [corefile]
filenameという実行ファイルと、corefileというコアファイルをもとに、デバッガを起動する。
-d [directory]
ソースファイルが置いてあるディレクトリを指定する。
コンパイルしたときと異なる場所にソースをおいてある環境でgdbを使う場合に便利なオプション。
run [args]
デバッガ内部でのプログラム実行開始。 argsにはコマンドライン引数を指定できる。
b [filename:][funcname] - breakpoint - {C-x SPACE}
ブレークポイントの設定。 引数として、関数名や、ソースファイル名:行数という指定が可能。
c [n] - continue
ブレークポイントで止めた後、実行を再開するコマンド。 引数として数字を指定すると、n回連続してcontinueする。
p [var] - print
変数の内容を表示する。 p/x var などとすると、変数 var の内容を16進数で表示する。
n [n] - next - {M-n}
次の行まで実行する。 引数として数字を指定すると、n回nextを行う。 step との違いは、関数コールをあっさり素通りすること。
s [n] - step - {M-s}
次の行まで実行する。 引数として数字を指定すると、n回stepを行う。 next との違いは、関数コールの内部まで追跡して1行実行を行うこと。
u [line] - until
〜行まで実行して止って欲しい場合に使う。 for とか while なんかのループの終了行を指定することが多い。
finish - finish - {C-c C-f}
現在選択中のフレームを最後まで実行する。 今見ている関数内部はもうステップ実行しなくてもいいや、ってな場合に使う。
i s - info stack
bt - backtrace
スタック情報表示。 up , down でスタックを上ったり下ったりできるぞ。
i func [funcname] - info function
関数名などのシンボルを表示する。 引数に関数名の一部を指定することもできる。 関数名でブレークポイントを仕掛けようとしたのは良いか、肝心の関数名を忘れてしまった場合などに重宝する。
core-file [filename]
coreファイルを読み込む。 ゲロの分析をすると、何が原因でゲロったか判明するかも。 core-file と info stack(スタック情報表示) , up, down はセットで使うことが多い。
up - {M-u}
スタックフレームを一つ上がる。 core dumpの原因は呼び出し元の不正な引数が原因だったときとかに便利。 呼び出し元をどんどんたどれるぞ。
down - {M-d}
スタックフレームを一つ下がる。 upの逆。
attach [pid] - attach
すでに動作中のプロセスのプロセスIDを指定すると、横からデバッガの制御化におくことができ、デバッグできるようになるという激しいコマンド。 デバッガを使うと画面が乱れてしまい、わけがわからなくなるアプリケーション(エディタなど)のデバッグに威力を発揮する、らしい。

余談:どうして Netscape Communicator のバイナリにはシンボル情報が入っていないんだ〜。

#
# debugger fork with mule (for bash)
#
gdbfork () {
	tmpfile=`echo gdb.$$.el`
	opts=""
	diropts=""
	#  get command line options
	for i in $*
	do
		case $1 in
		-d)
			shift
			diropts=$1
			;;
		*)
			opts="$opts $1"
			;;
		esac
		shift
	done
	echo "(gdb \"gdb $opts\")" > $tmpfile
	if [ x"$diropts"x != x""x ] ; then
		echo "(split-window-vertically)" >> $tmpfile
		echo "(dired \"$diropts\")" >> $tmpfile
		echo "(other-window 1)" >> $tmpfile
	fi
	mule -l $tmpfile
	rm $tmpfile
	
この関数の使用方法は gdbfork [filename] [corefile] -d [dired-dir] とする。 これで、新しく起動したmuleの内部でgdbが起動している状態になる。
global(システム標準)
GLOBAL source code tag systemのメインページ
CやC++,javaのソースコードの関数定義位置や呼び出し元一覧などを作成してくれるソフト。 周辺ソフトとして、CのソースをHTML形式に変換するツールもある。 雰囲気は ctags(1) や etags(1) に近い。
cvs(Concurrent Versions System) (システム標準)
バージョン管理ツール
FreeBSDのソースもこのツールで管理されている。 複数の人間による同じソースファイルの同時変更も可能である。
gcc
(システム標準)
みんな知っているので特に書くことはないCコンパイラ。
定義済マクロの表示方法
適当なCのソースファイルfoo.cを作成した後、gcc -E -dM foo.c とすれば、標準出力にシステム標準定義のマクロが表示される。
hexcalc-1.11.tgz
FreeBSD 2.1.5R CD-ROM ○
X Window System上で動作する16進数も計算できる電卓プログラム。 他にも、10,2,8進数も計算できるので、便利。
beav-1.40.4.tgz
FreeBSD 2.1.5R CD-ROM ○
バイナリファイルのエディタ&ビュアー。
基本的にコンソール画面で動作し、emacs ライクな画面とキーバインドなのでなかなかナイス。 イチ押し。
でも、muleが使えるなら M-x hexl-find-file を実行しても、バイナリファイルを16進数で編集できたりする。
hexdump (システム標準)
FreeBSD 2.1.0R CD-ROM ○
FreeBSD 2.1.5R CD-ROM ○
ファイルのダンプリストを表示するソフト。 何かを解析する必要に迫られた時には便利。 hexdumpはダンプリストの表示フォーマットを変更できるので、好きな表示形式にすると良いだろう。 同じような機能を持つプログラムにodがあるが、こちらは古くて機能が少ないので、hexdumpを使うと良いだろう。
bc (システム標準)
FreeBSD 2.1.0R CD-ROM ○
FreeBSD 2.1.5R CD-ROM ○
いわゆる電卓プログラム。 キーボードから1+2[リターン]と入力すると3と表示してくれる、異様にシンプルな電卓ソフト。 シンプルな外見だが、実は任意精度だったりするので、巨大な数値を計算する時に便利なのだ。

10進数を16進数に変換する csh 用のaliasを以下に示す。

alias tohex  'echo "obase = 16; \!*" | bc'
	

基数の変更もできるので、16進数の計算もできる。 (ただし、10進数でいうところの10〜15は、16進数では大文字のA〜Fを使って表現すること。) 16進数の計算を行う場合は、以下のように入力して基数を変更する。

obase=16
ibase=16
	
lclint があるページ
Cソースコードチェッカー&フロー解析ソフト lclint。
フリーソフトなので、興味のある人は拾ってみると良いかも。
FreeBSDページの目次に戻る
Copyright(c) 1996,97,98,99 George(小浜 純). All rights reserved.
私の作成したページは全部リンクフリーです。
このページに間違いや要望などがありましたら george@yk.rim.or.jp まで御連絡ください。

[ホームページ] [日記] [読んでいる日記] [秋葉原価格] [FreeBSD] [FreeBSD LINK] [検索]

home: <george@yk.rim.or.jp> or <george@ceres.dti.ne.jp>