大域変数への変更は、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