大域変数への変更は、pop コマンドや fix コマンドでは元に戻されません。大域変数に正しい値を手動で再割り当てするには、assign コマンドを使用します。
次の例は、修正継続機能を使用して簡単なバグを修正する方法を示しています。6 行目で NULL ポインタを逆参照しようとしたときに、セグメンテーションエラーが発生します。
dbx[1] 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
Running: testfix
(process id 4842)
signal SEGV (no mapping at the fault address) in copy at line 6 in file “testfix.cc”
6 while ((*to++ = *from++) != ’\0’);行 14 を 0 の代わりに buf に対して copy を実行するように変更し、ファイルを保存したあと、fix を実行します。
14 copy(buf); <=== modified line
(dbx) fix
fixing “testfix.cc” .....
pc moved to “testfix.cc”:6
stopped in copy at line 6 in file “testfix.cc”
6 while ((*to++ = *from++) != ’\0’)プログラムがここから続行された場合は、スタック上で依然として 0 ポインタがプッシュされるため、引き続きセグメント例外が発生します。pop コマンドを使用して、スタックの 1 フレームをポップします。
(dbx) pop
stopped in main at line 14 in file “testfix.cc”
14 copy(buf);プログラムがここから続行された場合、プログラムは実行されますが、大域変数 from がすでに 1 増分されているため正しい値を出力しません。assign コマンドを使用しないと、プログラムは ships と表示すべきところを hips と表示します。assign コマンドを使用して大域変数を復元してから、cont コマンドを使用します。 それにより、プログラムは正しい文字列を出力します。
(dbx) assign from = from-1 (dbx) cont ships