web-dev-qa-db-ja.com

リリースモードでデバッグする方法

C++プロジェクトをデバッグする必要がありますが、1つの依存関係がデバッグモードでコンパイルされず、これまでこの問題を修正できなかったため、リリースモードでプロジェクトをデバッグしたいと思います。

現在、nullポインターが原因でアプリケーションがクラッシュしますが、エラーの原因となっているコードはありません。リリースモードではブレークポイントが明らかに無視されるため、エラーを見つける最善の方法を知りたいと思います。

32
Pedro

VSで、プロジェクトを右クリックし、[プロパティ]を選択します。

  1. C/C++ノードをクリックします。デバッグ情報形式をC7互換(/ Z7)またはプログラムデータベース(/ Zi)に設定します。

  2. [リンカー]を展開し、[一般]ノードをクリックします。 [増分リンクを有効にする]を[いいえ](/ INCREMENTAL:NO)に設定します。

  3. [デバッグ]ノードを選択します。 [デバッグ情報の生成]を[はい(/ DEBUG)]に設定します。

  4. 最適化ノードを選択します。 [参照設定]を[はい](/ OPT:REF)に設定します。

    / OPT:REFが指定されている場合、/ OPT:ICFはデフォルトでオンになります。

これは、Microsoftのドキュメントから直接取り込んだものです。

私はこれを常に行いますが、デバッグモードでデバッグすることはほとんどありません。ご存知のように、リリースビルドで発生する多くのエラーは、デバッグビルドでは発生しない場合があります(ほぼ間違いなく、UBの呼び出しから発生するエラー)。

また、大量の画像処理を使用し、大きな画像の多くの圧縮/解凍を実行するプロジェクトに取り組んでいます。遅いデバッグビルドを使用することは、単に非現実的です。

62
Ed S.

常にプロジェクトの設定を変更して再コンパイルすることはできません。
時々、デバッグしたいリリースバージョン、またはクライアントから送信されたダンプファイルがあります。

リリースでC++プロジェクトを最適化してコンパイルすると、デバッガーが正しいオブジェクト情報を表示しないことがあります。

通常、ローカル変数が最初に使用され、多くの場合、このオブジェクトの情報はデバッガーに失われます。

その理由は、コンパイラが利用可能なハードウェアレジスタを使用して情報を保持し、最適化を使用してローカル変数の割り当てを回避するためです。

ここで不足している情報を見つける方法を提案しました。

C++でのリリースプロジェクトのデバッグ-失われたオブジェクト情報の検索

6
Yochai Timmer