杉本典
充
|
インターネットでは様々なオープンソースのプログラムが公開されています。 それらのプログラムは開発者の手によるデバッグ だけでなく、 多くの人もデバッグ作業に参画することによって品質を高めていきます。 そのデバッグ作業を終えたプログラムが いわゆる「安定したプログラム」 であり、 多くの人が安心して使えるレベルになるにはデバッグ作業はとて も大切な作業の 1 つです。 今回は、 Debian を使ってプログラムをデバッグする手法についてまとめてみま した。
gdb とは GNU Debugger*1 の ことで、 C 言語・ C++ 向けのソースレベルデバッガです。 開発者は gdb を使うことでプログラムが今どこの部分を実行してい るか、 プログラムの状態はどうなっているかを知ることができるため、 デバッグ作業を効率的に行うことができます。 「man gdb(1)」 によると、 gdb には大きく 4 つの機能があると書かれています。
gdb が使用する設定ファイルは”〜/.gdbinit”であり、 gdb の初期設定値をこのファイルに定義することで変更でき ます。
C 言語のプログラムを開発するためにはコンパイラが必要です。 gdb の他にプログラムを作成するために必要なソフトウェア 一式もインストールします。
$ sudo apt-get update
$ sudo apt-get install gcc make $ sudo apt-get install gdb |
環境も整ったところで、 プログラムを作成します。 今回は「FizzBuzz」 *2といわ れているプログラムを例にしてみます。
プログラムを gdb で操作するためにはプログラムにデバッグ情報を付与してビルドする必要があります。 gcc のコンパイルオ プション及びビルドオプションにデバッグシンボルを付与する”-g”オプションをつけてビルドします。 (デバッグ時の最適化レ ベルは開発者によって指定が違うこともあります。 ここでは最適化レベルは無指定 (=”-O0”、 最適化なし) としてビルドし ます。 )
それではシェルから gdb を起動します。 gdb を起動すると以下のような入力受付状態になります。
$ gdb
GNU gdb 6.8-debian Copyright (C) 2008 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu". (gdb) |
gdb のプロンプトでコマンドを入力することによりデバッガを通してプログラムを動かすことができます。 デバッグ作業でよ く使う gdb のコマンドを表 3.1に示します。
|
gdb は単体でも十分デバッグ可能ですが、 よりデバッグ作業を行いやすいように gdb のフロントエンドツールが 多くあります。 X Window System 上で動作する統合開発環境 (IDE) では KDevelop、 Anjuta、 Eclipse、 NetBeans など、 コマンドライン上でも動作する Emacs、 Vim などもフロントエンドとして利用することができ ます。
Emacs には GUD(Grand Unified Debugger) という機能があり、 Emacs 上で様々なデバッガと連携することができる仕組み です。 GUD は gdb に限らず、 perldb(perl 用デバッガ) や pdb(python 用デバッガ) なども起動することができ ます。
Emacs の実行中に以下のキーを入力して gdb を起動します。
M-x gdb
|
その後、 ミニバッファで実行ファイルを指定して Enter キーを入力します。
Run gdb (like this): gdb --annotate=3 ../a.out
|
すると図 3.2、 図 3.3のような画面に切り替わります。
また、 Emacs の設定ファイル”〜/.emacs.el”に「(setq gdb-many-windows t)」 を指定しておくと、 すると図 3.4、 図 3.5の ような画面で gdb が起動します。 この画面を表示するには「gud.el」 というファイルが必要であり。 lenny の場合は Emacs を インストールすると一緒にインストールされます。
私がプログラムを gdb を使ってデバッグするときの操作例を挙げてみます。
単発実行するプログラムの場合はデバッガでプログラムの起動を行い、 その後にデバッグ作業を開始することになり ます。
デーモンとして動作しているプログラムの場合は、 動作中のプログラムを gdb で制御する必要があるためアタッチする必要が あります。
fork するプログラムの場合、 fork() 後に親プロセスと子プロセスのどちらを追いかけるのかを「set follow-fork-mode parent」 などと設定しておく必要があります。
今回は gdb の紹介と Emacs GUD モードにおいてプログラムをデバッグする一例を紹介しました。 Emacs GUD モードを使っ たデバッグ操作は X Window System 上だけでなくコンソール環境でも同様の手順で実行できるため、 telnet 環境や ssh 環境 でも同じスタイルでプログラムのデバッグ作業を行うことができます。
みなさんも Debian を使ってたくさんデバッグしてみましょう。
第 28 回関西 Debian 勉強会 2009 年 10 月
____________________________________________________________________________________________