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/
これは、バイナリとソースが別々ディレクトリにある場合などに使えるでしょう。