2011-10-17 11 views
3

私のアプリケーションは非常に大きなハッシュテーブルを解放する必要があり、デバッグモードでは非常に遅いので遅くなります。デバッグシンボルはまったくありません。 実行ファイルをデバッグする必要があり、リリース版のcrtライブラリにリンクできるようにする必要があります。 私は "マルチスレッドdll"ではなく "マルチスレッドdll"を使用するように私の "コード生成"オプションを変更することでこれを行っていますが、私はハッシュテーブルフリールーチンにブレークポイントを入れて実際のフリーコールデバッグDLLで関数を使用しています。デバッグを使わないでVisual Studioを停止するにはどうすればいいですか?

他に何かお試しいただけますか?リリース構成で作業し、実際にデバッグする必要があるもののシンボルを生成するようにしてください。

#define _SECURE_SCL 0 

それが起こることを、以下の原因となります。

答えて

1

リリースCRTを使用していても、すべての最適化をオンにしても、デバッグシンボルを使用できます。実際には、これはVisual C++のデフォルトのリリース構成(プロジェクトのプロパティ/構成のプロパティ/ C/C++ /一般/デ​​バッグ情報の形式とリンカー/デバッグ/デバッグ情報の生成を参照してください)です。最適化されたコードはデバッグするのが難しいかもしれないことに注意してください。命令の順序が変更され、一部が最適化されて完全に離れてしまい、コードをステップ実行するときに予期しない動作が発生する可能性があります。

デバッグCRTをオフにするだけでは、 "マルチスレッドDLL(/ MDd)"を "マルチスレッドDLL(/ MD)"に変更するだけでは不十分で、_DEBUGも削除する必要がありますプリプロセッサ定義から。

あなたが経験している遅さは、あなたのプログラムの結果ではないかもしれません。これは、デバッガのアーチファクト(デバッガのUIで大きなデータ構造を表示するのが遅い)です。プログラムを実行してみてください(デバッグまたはリリースの設定 - それほど重要ではありません)デバッガーの外でと違いがあるかどうか確認してください。

デバッグの目的のためだけにハッシュテーブルを小さくすることはできません。「printfデバッグ」(つまり手動で診断を挿入する)か、リモートデバッグを試みる必要があります。

+0

悲しいことに、後者は本当です。デバッガのビルドさえもデバッガの外でうまくいきます。ハッシュテーブルが解放されると、おそらく実行可能ファイルにアタッチします。 – mike

1

(ところで2010 VS)stdafx.hをの開始時にこれを追加したり、デバッグビルドのプリプロセッサマクロとして定義

すべての標準的なイテレータはチェックされていません(イテレータはコンテナの境界を超えて移動でき、未定義の動作になります)。 チェックされたフォームの標準関数(以下のリストを参照)に対しては、チェックされていない関数の形式が使用されます。

出力イテレータがチェックイテレータの場合:

  • あなたが(例えば、STD ::コピー)標準関数の呼び出しに行動をチェックしてしまいます。
  • チェックされた関数(stdext :: checked_copyなど)への呼び出しで、動作が確認されます。
  • チェックされていない関数(stdext :: unchecked_copyなど)への呼び出しで、動作が確認されます。

出力イテレータがオフイテレータの場合:

  • あなたが(例えば、STD ::コピー)標準関数の呼び出しに未チェックの動作を取得しますが。
  • チェックされた関数(stdext :: checked_copyなど)を呼び出すと、コンパイラの警告が表示されます。
  • チェックされていない関数(stdext :: unchecked_copyなど)の呼び出しで、未チェックの動作が発生します。

あなたは、MSDNのChecked Iteratorsセクションでこの動作に関する詳細を読むことができます。通常、デバッグビルドではイテレーターをオンにする必要がありますが、短期間に操作を実行して迷惑になる特定のアプリケーションがあります。

+0

これはループの標準である私のハッシュフリーに当てはまるとは思わない – mike

関連する問題