内部エラーを解決する(C++)
操作手順:デバッガを使用する への移動
目次
内部コンパイラ エラー
C++ コンパイラから生成されるエラーのうち、内部コンパイラ エラー(ICE)と見なされるものは以下の 3 種類です:
- F1001 内部コード ジェネレータ エラー:
- <code 9ebf2012>F1001 [C++ 致命的エラー] <ファイル名>(<行番号>)</code f6dace17>
- <a 168c75ea>F1004 内部コンパイラ エラー: </a d3ab77a0>
- <code 9ebf2012>F1004 [C++ 致命的エラー] <ファイル名>(<行番号>): </code f6dace17>
- 内部バックエンド エラー
<エラー コード>
これら 3 つのエラーはすべて、コンパイラのバグに起因します。 <ファイル名> と <行番号> は、エラーの発生前にコンパイラが解析していたソース コード箇所ですが、問題の発生源を示すかどうかはわかりません。 <エラー コード> は、エラーの発生時にコンパイラが何を行おうとしていたかをコンパイラ技術者に伝える固有の情報です。
内部コンパイラ エラーが発生した場合の対処
- ユーザー コードが間違っているとは限らないということを覚えておきます。
- クリーン ビルドを試みます。
- コマンド ライン ビルドを試みます。
- ソース コードを分析して問題を絞り込みます。
- バグ レポートを提出します。
クリーン ビルドの実行方法
- [プロジェクト マネージャ]でプロジェクトを右クリックし、[クリーンアップ]を選択します。
- ディレクトリ構造を調べて、プロジェクトに .obj、.tds、.dcu、.#*、.pch のどの種類のファイルも関連付けられていないことを確認します。
- プロジェクトのコンテキスト メニューから[ビルド]を選択します。
コマンド ライン ビルドの実行方法
- [メッセージ]ペインの[出力]タブからコンパイラのコマンド ラインをコピーし、コマンド シェルなどで使用することができます。
- Windows タスク バーの[スタート]メニューから[(すべての)プログラム|<本製品プログラム グループ名>|RAD Studio コマンド プロンプト]を選択した後、「msbuild <プロジェクト名>.cbproj」と入力します。
ソース コードの分析方法
クリーン ビルドでもコマンド ライン ビルドでも問題が解決しない場合は、ソース コードを分析して問題を絞り込むことができます。
- エラー メッセージで言及されているファイルをプリプロセッサで処理します。 それには、[プロジェクト マネージャ]で対象ファイルを右クリックして[プリプロセス]を選択します。もしくは、コマンドラインに移動し、コマンドでコンパイラ(bcc32.exe など)をプロプロセッサ(cpp32.exe)に置き換えて、ファイルをコンパイルしてください. これにより、コンパイルの外部依存関係のないファイルが生成されます。 それは、非常に大きなファイルになる場合があります。
- プリプロセッサで処理されたファイルを -P スイッチを付けてコンパイルします。これで十分問題を再現できる場合は、すぐにステップ 4 に進んでかまいません。
- .i ファイルが正常にコンパイルされた場合は、問題を再現するのにスイッチを追加する必要があるかもしれません。 問題を再現するのにどのスイッチが必要か決定するまで、元のコマンド ライン ビルドに使用したあらゆるスイッチを追加しながら .i ファイルを再コンパイルします。
- これで、バグ レポートを提出するのに足る情報になります。 これ以上問題を絞り込まない場合は、バグ レポートの提出方法を確認してください。
- エラーが発生した行以降とコメントをすべて削除できます。
- 問題と関係がない可能性のある関数本体やその他のコード部分をコメントにしていきます。
- 問題の再生に必要ない部分が決まるにつれて、その部分を .i ファイルから削除してかまいません。
- 問題の再生に必要なコードをいったん絞り込んだら、バグ レポートを提出すると共に、回避策を試して見つけるための構文要素の種類を分析できます。
バグ レポートの提出方法
- quality.embarcadero.com の Quality Portal を使用して、新しいバグ レポートをファイルします。
- プロジェクト([Project])として[C++Builder]を選択します。
- 分野([Area])として[Compiler|C++]を選択します。
- エラーの再現に必要なコマンド ラインをバグの[Steps]タブに入力します。
- .i ファイルを添付します。
- チェック マーク([Post])ボタンをクリックして、レポートを保存します。