「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デバッグ