RTC を修正継続機能とともに使用すると、プログラミングエラーを簡単に分離して修正することができます。修正継続機能を組み合わせて使用すると、デバッグに要する時間を大幅に削減することができます。次に例を示します。
% cat -n bug.c 1 #include stdio.h 2 char *s = NULL; 3 4 void 5 problem() 6 { 7 *s = 'c'; 8 } 9 10 main() 11 { 12 problem(); 13 return 0; 14 } % cat -n bug-fixed.c 1 #include stdio.h 2 char *s = NULL; 3 4 void 5 problem() 6 { 7 8 s = (char *)malloc(1); 9 *s = 'c'; 10 } 11 12 main() 13 { 14 problem(); 15 return 0; 16 } yourmachine46: cc -g bug.c yourmachine47: dbx -C a.out a.out のシンボル情報を読んでいます rtld /usr/lib/ld.so.1 のシンボル情報を読んでいます librtc.so のシンボル情報を読んでいます libc.so.1 のシンボル情報を読んでいます libintl.so.1 のシンボル情報を読んでいます libdl.so.1 のシンボル情報を読んでいます libw.so.1 のシンボル情報を読んでいます (dbx) check -access アクセス検査 - ON (dbx) run 実行中: a.out (プロセス id 15052) 実行時検査を有効にしています...done 非割り当て領域への書き込み (wua): 1 バイト書き込みを NULL ポインタを通してしようとしました。 現関数: problem 7 *s = 'c'; (dbx) pop main で停止しました 行番号 12 ファイル "bug.c" 12 problem(); (dbx) #ここでファイルを編集します。この例では正しいバージョンをコピーしま す。 (dbx) cp bug-fixed.c bug.c (dbx) fix 修正中 "bug.c" ...... pc は "bug.c":14 に移動しました main で停止しました 行番号 14 ファイル "bug.c" 14 problem(); (dbx) cont 実行完了。終了コードは 0 です。 (dbx) quit 'a.out' の次のモジュールは変更されました (修正済み): bug.c プログラムの再構築が必要です。 |
修正と継続についての詳細は、「メモリーリーク (mel) エラー」を参照してください。