Emacsでgdbを使ってデバグする方法

題材として、Linux + Emacs + gdbでImageMagickの挙動を調べてみましょう。

Emacsとgdbをインストールする

たいていのLinuxではgdbはデフォルトでは入っていないので、yumなりapt-getなりでインストールしましょう。

ImageMagickをデバグオプション付きでビルドする

ftp://ftp.kddlabs.co.jp/graphics/ImageMagick/ からtar.gzを落としてきてコンパイルします。

今回は実験なのでシステムワイドな環境を汚さないために /tmp/ImageMagick/ 下にインストールします。
GDBデバグ可能にするために、./configureのところで"-g3 -O0"オプションをつけるのがポイントです。
wget ftp://ftp.kddlabs.co.jp/graphics/ImageMagick/ImageMagick-6.8.8-9.tar.gz
tar xfz ImageMagick-6.8.8-9.tar.gz
cd ImageMagick-6.8.8-9
./configure CFLAGS="-g3 -O0"  --prefix=/tmp/ImageMagick --without-x
make
sudo make install

さてインストールできたら、適当に画像(/tmp/flower.jpg)を用意して文字入れをしてみましょう。
/tmp/ImageMagick/bin/convert  -pointsize 300 -gravity south  -annotate 0 "abc" -fill red /tmp/flower.jpg /tmp/out.jpg
これで画像に文字が入ったらインストールは成功です。

Emacsを起動してgdbを実行する

Emacsを普通に起動して、
M-x gdb
します。
すると
Run gdb (like this): gdb -i=mi 
のように聞かれるので、
Run gdb (like this): gdb -i=mi /tmp/ImageMagick/bin/convert
のように、デバグしたい実行バイナリファイルを指定します。

するとgdbが起動します。
Current directory is /tmp/ImageMagick/bin/
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6_4.1)
Copyright (C) 2010 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-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /tmp/ImageMagick/bin/convert...done.
(gdb)
ここで、ブレークポイントをしかけます。
"b main" と打つとmain関数にブレークポイントが設定されます。
(b は breakの略)
(gdb) b main
Breakpoint 1 at 0x400967: file utilities/convert.c, line 92.
つぎに、rコマンドに引数を渡して実行開始します。
・・・ですがここが初心者にわかりにくいので具体的に説明します。
そもそも調査したいコマンドは次のようなものでした。
/tmp/ImageMagick/bin/convert  -pointsize 300 -gravity south  -annotate 0 "abc"  /tmp/flower.jpg /tmp/out.jpg
ここで、コマンド名のところを"r"に置き換えて入力します。
(gdb) r  -pointsize 300 -gravity south  -annotate 0 "abc" /var/www/html/flower.jpg /tmp/out.jpg
すると、デバグモードで実行が始まります。
Windowが2つ開いて、片方がgdbの画面(*gud-convert*)、片方がC言語のソースコードになっているはずです。

gdbの画面(*gud-convert*)で、"s"を連打すると、どんどんstep実行が進みます。

任意の場所にブレークポイントを設定する方法

EmacsでC言語のソースコードを開いて、任意の場所で
Ctr-x [Space]
と打ちます。
そうするとそこにブレークポイントが設定されます。

今回のannotate.cのAnnotateImage関数内でブレークポイントを設定すれば、文字入れの挙動がいろいろ追えると思います。

ぜひ一度自分の手を動かしてやってみてください。

Happy Hacking!

参考

C言語のソフトウェアをGDBデバグ用にビルドする方法
カテゴリ:

人気記事