[Linux]GDBで単体テスト(lcrashのデバッグ)

GDBを使ってlcrashをデバッグしたときの話。

lcrash内に実装したメソッドをステップ実行したり、変数の値を確認したりしてデバッグしていました。


  • 対象テスト
    プログラム内に、sample_methodというメソッドがあり、その中のコードのテストを行いたいというケース
    lcrashは改造してあります。
  1. 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".
  2. 引数の設定(set args)(memの名前も変更しております)
    (gdb) set args System.map dump_file Kerntypes
  3. ブレイクポイントの設定(break、b)
    (gdb) b sample_method
    Breakpoint 1 at 0x805e9f0: file main.c, line 799.
  4. 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))
  1. どんなコードなのか見る(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
  2. そのまま「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
  3. テスト項目となっていた”strlen”の値の確認(print、p)
    (gdb) p strlen(pBuff)
    $1 = 12
  4. if文の内容をチェック
    (gdb) p ((strlen(pBuff) < 11) || (strlen(pBuff) > 12))
    $2 = 0
  5. 実際に処理が通るかチェック
    次のコードへ進む(next、n)

    (gdb) n
    804             if(!( (*(pBuff + 10) == '\n') || ((*(pBuff + 10) == '\r') && (*(pBuff + 11) == '\n')) ))

799行目のif文に入らず、次のコード804行目まで進んだことがわかった。

コメント

タイトルとURLをコピーしました