dbx コマンドによるデバッグ

修正後の変数の変更

大域変数への変更は、pop コマンドでも fix コマンドでも取り消されません。大域変数に正しい値を手作業で再び割り当てるには、assign コマンドを使用してください。

以下の例は、修正継続機能を使用して簡単なバグを修正する方法を示しています。6 行目で NULL ポインタを逆参照しようとしたときに、セグメンテーションエラーが発生します。


(dbx) list 1,$
    1   #include<stdio.h>
    2   
    3   char *from = "ships";
    4   void copy(char *to)
    5   {
    6   while ((*to++ = *from++) != '¥0');
    7   *to = '¥0';
    8   }
    9   
   10   main()
   11   {
   12   char buf[100];
   13   
   14   copy(0);
   15   printf("%s¥n", buf);
   16   return 0;
   17   }
(dbx) run
実行中: testfix 
(プロセス id 11667)
シグナル SEGV (フォルトのアドレスにマッピングしていません) 関数 copy 行番号 6  ファイル "testfix.c"
    6   while ((*to++ = *from++) != '¥0');

edit でファイルの編集をします。14 行目を 0 ではなく buf をコピー (copy) するように変更し、fix を実行します。


(dbx) edit
# エディタが起動します。 
   14  copy(0);# 変更前
   14  copy(buf);# 変更後
# エディタを保存して終了します。
(dbx) fix
修正中  "testfix.c" ......
 pc は "testfix.c":6  に移動しました
copy で停止しました 行番号 6  ファイル "testfix.c"
    6      while ((*to++ = *from++) != '¥0');

ここでプログラムを続行しても、NULL ポインタがスタックをプッシュしているため SEGV が返されます。pop コマンドを使用して、スタックフレームを 1 つ上がってください。


(dbx) pop
main で停止しました 行番号 14  ファイル "testfix.c"
   14   copy(buf);

ここでプログラムを続行すると、プログラムは実行されますが、大域変数 from がすでに増分されているため正しい値が出力されません。assign コマンドを使用して大域変数を復元し、続行してください。プログラムは次のように正しい値を表示します。assign コマンドを使用しないと、プログラムは ships と表示すべきところを hips と表示します。


(dbx) assign from = from-1
(dbx) cont
ships