dbx コマンドによるデバッグ

エラーの抑止

RTC はエラーレポートの数や種類を限定するよう、エラーの抑制機能を備えています。エラーが発生してもそれが抑制されている場合は、エラーは無視され、報告されずにプログラムは継続します。

エラー抑止は、suppress コマンドを使用して実行されます。抑止は、unsuppress コマンドによって取り消すことができます。抑止は、同じデバッグセッション内の run コマンドの実行を通して持続しますが、debug コマンドでは持続されません。

次の抑制機能があります。

どのエラーを抑止するかを指定する必要があります。以下のように、プログラムのどの部分に抑制を適用するかを指定できます。

大域 

スコープが指定されていないと全体のスコープが対象になり、 すべてのプログラムに適用されます。 

ロードオブジェクト 

共有ライブラリなど、すべてのロードオブジェクトが対象になります。 

ファイル 

特定のファイルのすべての関数が対象になります。 

関数 

特定の関数が対象になります。 

行 

特定のソース行が対象になります。 

アドレス 

特定のアドレスが対象になります。 

次の例では、main.cc はファイル名、foobar は関数を示し、a.out は実行可能ファイルの名前を示します。

割り当てが関数 foo で起こったメモリーリークは報告しません。


suppress mel in foo

libc.so.1 から割り当てられた使用中のブロック報告を抑止します。


suppress biu in libc.so.1

a.out の非初期化メモリーからの読み取りを抑止します。


suppress rui in a.out

ファイル main.cc の非割り当てメモリーからの読み取りを報告しません。


suppress rua in main.cc

main.cc の行番号 10 での重複解放を抑止します。


suppress duf at main.cc:10

関数 bar のすべてのエラー報告を抑止します。


suppress all in bar

デフォルトの抑止

RTC では、-g オプション (記号) を指定してコンパイルを行わなくてもすべてのエラーを検出できます。しかし、非初期化メモリーからの読み取りなど、正確さを保証するのに 記号 (-g) 情報が必要な特定のエラーもあります。このため、a.outrui や 共有ライブラリの rui, aib, air など特定のエラーは、記号情報が取得できない場合は、デフォルトで抑制されます。この動作は、suppressunsuppress コマンドの -d オプションを使用することで変更できます。

たとえば、


unsuppress -d rui

を実行すると、RTC は記号情報が存在しない (-g オプションを指定しないでコンパイルした) コードについて「非初期化メモリーからの読み取り (rui)」を抑制しません。

抑止によるエラーの制御

プログラムが大きい場合、エラーの数もそれに従って多くなることが予想されます。このような場合は、suppress コマンドを使用することにより、エラーレポートの数を管理しやすい大きさまで抑制し、一度で修正するエラーを制限します。抑制するエラーの数を徐々に減らしながら、この動作を繰り返してください。

たとえば、一度で検出するエラーをタイプによって制限できます。一般的によくあるエラーのタイプは rui、rua、wua に関連したもので、この順序で検出されます。rui エラーはそれほど致命的なエラーではなく、このエラーが検出されてもたいていの場合プログラムは問題なく実行終了します。それに比べて ruawua エラーは不正なメモリーアドレスにアクセスし、ある種のコーディングエラーを引き起こすため、問題は深刻です。

まず ruirua エラーを抑制し、wua エラーをすべて修正した後、もう一度プログラムを実行します。次に rui エラーだけを抑制し、rua エラーをすべて修正した後、もう一度プログラムを実行します。さらにエラーの抑制をせずに、すべての rui エラーを修正します。最後にプログラムを実行し、エラーがすべて修正されたことを確認してください。

最後に報告されたエラーを抑制したい場合は、suppress -last を使用します。また報告されるエラーの数を限定したい場合は、suppress コマンドの代わりに dbxenv rtc_error_limit n を使用します。