コード・デバッグの最適化

最適化の際にだけ問題が表面化するときは、初期化されていない変数を使用するなどの、 最適化によって発生する論理エラーまたはコンパイル・エラーを示す 場合がよくあります。最適化バージョンでだけ発生するプログラム・エラーが検出された場合は、 通常、障害モジュールを検出する、以下のようなバイナリー検索手法を使用することにより、 エラーの原因を見つけることができます。

  1. まず、モジュールの半分を最適化し、エラーが続くかどうかを調べます。
  2. 最適化モジュール数の変更後に、そのつどエラーが続く場合は、 数の少ない方のモジュールを最適化します。 エラーがなくなったら、最適化するモジュールを増やします。 最後には、 エラーを、1 つのモジュールまたは少数のモジュールに絞りこむことができます。
  3. 障害モジュールをデバッグします。できれば、そのモジュールの 命令スケジューリングの最適化をオフにします。書き込み前の変数からの読み取り、 ポインターや配列に割り振られた記憶域境界を超えるポインターや配列指標などの問題を調べます。

最適化コードをデバッグするときは、デバッガー・ビューの情報によって、実際には存在しない論理問題の可能性が示される場合があります。 以下の点を考慮してください。

ローカル変数は通常誤っている

変数の現行値を示す場合は、 「変数」ビューを信用しないでください。 数値、文字値、およびポインターは、プロセッサー・レジスターに保持される場合があります。 最適化プログラムでは、これらの値およびポインターは必ずしもメモリーに書き出されるとは限りません。場合によっては必要でないために廃棄される場合もあります。

静的変数および外部変数は現行値とは限らない

最適化関数内では、 静的変数または外部変数の値が必ずメモリーに書き出されるとは限りません。 しかし、静的変数は、関数のエントリー/エグジット・ポイントでは常に正常です。

「レジスター」ビューおよび「メモリー」ビューは常に現行

レジスター」ビューと「メモリー」ビューは正常です。 「変数」ビューなどの、実際の変数を示すモニターとは異なり、 「レジスター」ビューと「メモリー」ビューは、 常に、実行が最後に停止した時点の最新値です。

ソース・ステートメントが最適化され過ぎている可能性

「逆アセンブル」ビューまたは「混合」ビューを使用してプログラムのマシン・コードを調べると、例えば、ソース・コードの変数に対する割り当てで、逆アセンブル・コードが作成されていないことを発見する場合があります。これは、割り当て後に、変数の値が使用されていないことを示している可能性があります。

ソース・ステートメント順序が必ずしも維持されていない

最適化が多いと、生成済みコードの再配列が行われます。 生成済みコードが再配列されると、 ソース・ステートメントの順序は維持されません。

関連タスク
デバッグを考慮したプログラムのコンパイル
ご利用条件 | フィードバック
(C) Copyright IBM Corporation 2001, 2005. All Rights Reserved.