GDBを使ってlcrashをデバッグしたときの話。
lcrash内に実装したメソッドをステップ実行したり、変数の値を確認したりしてデバッグしていました。
- 対象テスト
プログラム内に、sample_methodというメソッドがあり、その中のコードのテストを行いたいというケース
lcrashは改造してあります。
- gdb起動
> gdb ./lcrash GNU gdb 6.6 Copyright (C) 2006 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 "i586-suse-linux"... Using host libthread_db library "/lib/libthread_db.so.1".
- 引数の設定(set args)(memの名前も変更しております)
(gdb) set args System.map dump_file Kerntypes
- ブレイクポイントの設定(break、b)
(gdb) b sample_method Breakpoint 1 at 0x805e9f0: file main.c, line 799.
- lcrash起動(run、r)
(gdb) r Starting program: ./lcrash System.map dump_file Kerntypes
- 起動途中にブレイクポイントに引っかかり止る
Breakpoint 1, sample_method (pBuff=0xbfc4408a "0x80000000\r\n", uladdress=0x81807e8) at main.c:799 799 if((strlen(pBuff) < 11) || (strlen(pBuff) > 12))
- どんなコードなのか見る(list、l)
特に必要はない(gdb) list 794 int sample_method( char* pBuff, uaddr_t* uladdress) 795 { 796 int cnt ; 797 char nptr[11]; 798 799 if((strlen(pBuff) < 11) || (strlen(pBuff) > 12)) 800 { 801 return (1); 802 } 803
- そのまま「Enter」で前回と同じコマンドを実行
(gdb) 804 if(!( (*(pBuff + 10) == '\n') || ((*(pBuff + 10) == '\r') && (*(pBuff + 11) == '\n')) )) 805 { 806 return (1); 807 } 808 809 if(!( ((*pBuff == '0') && (*(pBuff + 1) == 'x')) || ((*pBuff == '0') && (*(pBuff + 1) == 'X')) )) 810 { 811 return (1); 812 } 813
- テスト項目となっていた”strlen”の値の確認(print、p)
(gdb) p strlen(pBuff) $1 = 12
- if文の内容をチェック
(gdb) p ((strlen(pBuff) < 11) || (strlen(pBuff) > 12)) $2 = 0
- 実際に処理が通るかチェック
次のコードへ進む(next、n)(gdb) n 804 if(!( (*(pBuff + 10) == '\n') || ((*(pBuff + 10) == '\r') && (*(pBuff + 11) == '\n')) ))
799行目のif文に入らず、次のコード804行目まで進んだことがわかった。
コメント