■ GDBの使い方(3)

gdbをEmacsから使おうということです。 使用方法はシェルから使うのと同じですが、 プログラムソースとの連係が格段に違うと思います。

gdb @ Emacs

Emacs内でgdbを起動するには、次のようにします。

M-x gdb

すると、おそらく次のように入力を促されます。

Run gdb (like this): gdb

ここで、引数に実行形式のファイルを与えることもできます(GDBの使い方(1)参照)。 また、第2引数にコアファイルを与えることもできます(GDBの使い方(2)参照)。 以下では、実行形式のファイル(sample)を与えたとします。

Run gdb (like this): gdb sample

Emacs内でgdbが起動するので、runでsampleを実行します。

Current directory is /home/hoge/temp/
GNU gdb 5.0
Copyright 2000 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux"...
(gdb)run
Starting program: /home/hoge/sample 

Program received signal SIGSEGV, Segmentation fault.
0x08048437 in sub1 () at sample.c:16
(gdb)

ソースコードとの連係

上記のプログラム(sample)は、16行目でセグメンテーションフォルト しています。 このとき、Emacsの別のフレームが開いて次のようにsampleの ソース(sample.c)が表示されます。 =>で、実行が止まっているところを自動的に表示してくれます!

#include <stdio.h>

static int sub1();
static int *sub2();

int main(){
  int num = 7;
  num = sub1();
  printf("number = %d\n",num);
  return 0;
}

static int sub1(){
  int *p;
  p = sub2();
=>return *p;
}

static int *sub2(){
  return 0;
}

他にも、ブレークポイントやwatchコマンドにより監視していた値が変化して 実行が中断したときも、その中断した行のソースを表示します。

ディレクトリ指定

上記の機能は、実行ファイルとソースファイルがカレントディレクトリに ある場合にしか使えません。 しかし、Emacsを最初に起動したディレクトリが デバッグしたいファイルのあるディレクトリと違うなどという場合もあるでしょう。 そんなときは、

M-x cd

で、Emacsにおけるカレントディレクトリを変更できます。 デバッグを行いたいディレクトリに移動しておいてから、 gdbを起動すると良いでしょう。

また、gdbの中からもdirectoryコマンドで パスの追加ができます。

(gdb) directory ~/src/

これは、バイナリとソースが別々ディレクトリにある場合などに使えるでしょう。