「gdbを用いたprintfデバッグ」の版間の差分

提供: セキュリティ
移動: 案内検索
(ページの作成:「プログラムをデバッグするときに、ソースコードを書き換えずに、gdbを用いてprintfデバッグを実現する方法を紹介しま...」)
(相違点なし)

2014年2月23日 (日) 20:46時点における版

プログラムをデバッグするときに、ソースコードを書き換えずに、gdbを用いてprintfデバッグを実現する方法を紹介します。

読み方

printfデバッグ
ぷりんとえふ でばっぐ

概要

プログラムをデバッグするときに、printfデバッグを行っている人が多いと思われます。C言語/C++のソースコードを書き換えて、printfを至るところに埋め込んでいるケースもあるでしょう。ソースコード編集型のprintfデバッグを行うと、ソースコードが余計なことで増えてしまいます。また後から、不要なprintfを削除しなければならなくなります。printfを追加するたびに、コンパイルも必要になります。

そこで、ソースコードレベルでprintf()関数を使用せずに、「デバッガgdbを用いてprintfデバッグを行う方法」を紹介します。

なんの変哲もないプログラムを例にします。 プログラムは、ループでただ数字を足していくだけのプログラムです。 今回の例では、ループ内の変数の値をprintfデバッグしたい、という想定です。

gdb_debug.c の 12 行目の値をデバッグしてみましょう。

GDBコマンド達を書いたファイルを gdb -x オプションで指定すると、自動的にコマンドを実行してくれます。言い換えれば、シェルスクリプトライクな感じです。

ソースコード

ソースコードは gdb_debug.c です。

/*
 * gdb_debug.c
 * Copyright (C) 2014 kaoru <kaoru@bsd>
 */
#include <stdio.h>
int
main(int argc, char const* argv[])
{
        int i = 0;
        int sum = 0;
        for (i = 0; i < 5; ++i) {
                sum += i;
        }
        return 0;
}

行番号を入れておきます。

% cat -n gdb_debug.c
     1  /*
     2   * gdb_debug.c
     3   * Copyright (C) 2014 kaoru <kaoru@bsd>
     4   */
     5  #include <stdio.h>
     6  int
     7  main(int argc, char const* argv[])
     8  {
     9          int i = 0;
    10          int sum = 0;
    11          for (i = 0; i < 5; ++i) {
    12                  sum += i;
    13          }
    14          return 0;
    15  }

gdbinit

break gdb_debug.c:12
commands
        silent
        printf "i=%d, sum=%d\n", i, sum
        continue
end
run
quit

コンパイル方法

cc -ggdb gdb_debug.c

使い方

それでは、12行目の状態を表示してみましょう。

% gdb -q -x ./gdbinit ./a.out
Breakpoint 1 at 0x8048498: file gdb_debug.c, line 12.
i=0, sum=0
i=1, sum=0
i=2, sum=1
i=3, sum=3
i=4, sum=6
 
Program exited normally.

簡単にgdbを用いてprintfデバッグが行えました。

関連項目

  • IDA Pro: 逆アセンブラ
  • OllyDbg
  • Immunity Debugger
  • WinDbg
  • gdb
    • cgdb: GDB CUI フロントエンド
    • DDD: GDB フロントエンド
    • Insight: GDB フロントエンド
    • gcore
    • gdbを用いたprintfデバッグ