Sun Studio 12: dbx コマンドによるデバッグ

RTC での修正継続機能の使用

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) エラー」を参照してください。