RTC はエラーレポートの数や種類を限定するよう、エラーの抑制機能を備えています。エラーが発生してもそれが抑制されている場合は、エラーは無視され、報告されずにプログラムは継続します。
エラー抑止は、suppress コマンドを使用して実行されます。抑止は、unsuppress コマンドによって取り消すことができます。抑止は、同じデバッグセッション内の run コマンドの実行を通して持続しますが、debug コマンドでは持続されません。
次の抑制機能があります。
スコープと種類による抑制
どのエラーを抑止するかを指定する必要があります。以下のように、プログラムのどの部分に抑制を適用するかを指定できます。
大域 |
スコープが指定されていないと全体のスコープが対象になり、 すべてのプログラムに適用されます。 |
ロードオブジェクト |
共有ライブラリなど、すべてのロードオブジェクトが対象になります。 |
ファイル |
特定のファイルのすべての関数が対象になります。 |
関数 |
特定の関数が対象になります。 |
行 |
特定のソース行が対象になります。 |
アドレス |
特定のアドレスが対象になります。 |
最後のエラーの抑制
デフォルトでは、RTC は最新のエラーを抑止して、同じエラーについてのレポートの反復を防ぎます。これは、dbxenv 変数 rtc_auto_suppress によって制御することができます。
その他
dbxenv 変数 rtc_error_limit を使用すると、報告されるエラーの数を制限することができます。
次の例では、main.cc はファイル名、foo と bar は関数を示し、a.out は実行可能ファイルの名前を示します。
割り当てが関数 foo で起こったメモリーリークは報告しません。
suppress mel in foo
libc.so.1 から割り当てられた使用中のブロック報告を抑止します。
suppress biu in libc.so.1
suppress rui in a.out
ファイル main.cc の非割り当てメモリーからの読み取りを報告しません。
suppress rua in main.cc
suppress duf at main.cc:10
suppress all in bar
RTC では、-g オプション (記号) を指定してコンパイルを行わなくてもすべてのエラーを検出できます。しかし、非初期化メモリーからの読み取りなど、正確さを保証するのに 記号 (-g) 情報が必要な特定のエラーもあります。このため、a.out の rui や 共有ライブラリの rui, aib, air など特定のエラーは、記号情報が取得できない場合は、デフォルトで抑制されます。この動作は、suppress や unsuppress コマンドの -d オプションを使用することで変更できます。
unsuppress -d rui
を実行すると、RTC は記号情報が存在しない (-g オプションを指定しないでコンパイルした) コードについて「非初期化メモリーからの読み取り (rui)」を抑制しません。
プログラムが大きい場合、エラーの数もそれに従って多くなることが予想されます。このような場合は、suppress コマンドを使用することにより、エラーレポートの数を管理しやすい大きさまで抑制し、一度で修正するエラーを制限します。抑制するエラーの数を徐々に減らしながら、この動作を繰り返してください。
たとえば、一度で検出するエラーをタイプによって制限できます。一般的によくあるエラーのタイプは rui、rua、wua に関連したもので、この順序で検出されます。rui エラーはそれほど致命的なエラーではなく、このエラーが検出されてもたいていの場合プログラムは問題なく実行終了します。それに比べて rua と wua エラーは不正なメモリーアドレスにアクセスし、ある種のコーディングエラーを引き起こすため、問題は深刻です。
まず rui と rua エラーを抑制し、wua エラーをすべて修正した後、もう一度プログラムを実行します。次に rui エラーだけを抑制し、rua エラーをすべて修正した後、もう一度プログラムを実行します。さらにエラーの抑制をせずに、すべての rui エラーを修正します。最後にプログラムを実行し、エラーがすべて修正されたことを確認してください。
最後に報告されたエラーを抑制したい場合は、suppress -last を使用します。また報告されるエラーの数を限定したい場合は、suppress コマンドの代わりに dbxenv rtc_error_limit n を使用します。