printf()を書くかわりに.gdbinitを書く

わたしがprintf()デバッグをしない理由 2009-03-22 - 未来のいつか/hyoshiokの日記
というエントリを読んだ。

僕もわりと安易にprintf()してしまうのだけれど、以前は結構頑張ってgdbを使っていたのでちょっとそのころを思い出して書く。

printf()が便利なのは、それがコードとして残ることだ。IDEのデバッガだと同じ操作を何度もするのが面倒だったりするわけだけど。
でもgdbだと.gdbinitというファイルにgdbの操作を書いておくことができる。

例えばこんなしょーもないコードがあったとする(sum.c)。

int
main()
{
    int i, j;
    for (i = 1, j = 0; i <= 10; i++) {
        j += i;
    }

    return 0;
}

で、ここでjとiの内容を表示したいとする。printf()を入れたい気持を抑えてこんな.gdbinitファイルを書く。

break sum.c:6
commands
    silent
    printf "i=%d, j=%d\n", i, j
    continue
end

run

最後のrunはgdbを開始したらすぐデバッグ開始するためのもの。あとデバッグオプションを付けてコンパイルする。-O0を付けるかどうかはケースバイケースで。とりあえず最小限のMakefileはこんな感じ。

CFLAGS=-g
sum:

makeして実行。

$ make
cc -g    sum.c   -o sum
$ gdb sum
GNU gdb Red Hat Linux (6.3.0.0-1.153.el4_6.2rh)
Copyright 2004 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-gnu"...Using host libthread_db library "/lib/tls/libthread_db.so.1".

Breakpoint 1 at 0x8048364: file sum.c, line 6.
i=1, j=0
i=2, j=1
i=3, j=3
i=4, j=6
i=5, j=10
i=6, j=15
i=7, j=21
i=8, j=28
i=9, j=36
i=10, j=45

Program exited normally.
(gdb)

これで完全にprintf()の代わりになる。これだけで再コンパイルの手間が省けるのであれば、十分覚える価値があると思う。