Emacsでgdbを使ってデバグする方法
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!