2009-06-24 13 views
9

大規模なC++アプリケーションがあります。バグを調査するためにデバッグビルドとして実行する必要があることがあります。デバッグビルドはリリースビルドよりもはるかに遅く、ほとんど使用できなくなります。MSVCデバッグビルドをより速く実行する方法

MSVCデバッグビルドを行うためのトリックは、デバッグ性をあまりにも犠牲にすることなく、より高速に実行できますか?

+0

これはコミュニティウィキです。 – Aamir

+0

私は過去に「コミュニティウィキ」にすべての質問をするように言われました。私はオプションが何をしているのか本当にわからない。 – pauldoo

+0

............ lol – demoncodemonkey

答えて

11

リリースでデバッグする選択したファイルの先頭に#pragma optimize("", off)を使用します。これにより、より良いスタックトレース/変数ビューが得られます。

あなたがバグを追跡する必要があるファイルがほんの少しであればうまく動作します。

+0

これは私たちが後で発見したトリックで、しばらく使っています。 (私は戻ってきて、SOを更新するのを忘れていた)。正しい構文は '#pragma optimize(" "、off)'で後で '#pragma optimize(" "on")を続けてコンパイラを正常に戻すことができるので、このトリックを一度に1つの機能しか使用できません。 – pauldoo

+0

エラーを指摘してくれてありがとう。私はそれを更新しました。 – Macke

3

プロフィールappと時間を取って何ti参照してください。デバッグにどのような調整が必要かを確認することができます。

+0

どうしたのですか?そして、それはデバッグビルドをもっと速くすることと関係がありますか? – Owl

1

デバッグビルドとリリースビルドには、デバッグ性と速度の両方に影響するいくつかの違いがあります。最も重要なのは_DEBUG/NDEBUGの定義、コンパイラの最適化、デバッグ情報の作成です。

3つ目のソリューション構成を作成して、これらの設定を使用して再生したい場合があります。たとえば、リリースビルドにデバッグ情報を追加しても、パフォーマンスは低下することはありませんが、実際のスタックトレースを取得しているため、コンパイラの最適化のためにライン情報だけが信頼できません。

信頼できる回線情報が必要な場合は、次に進み、最適化を無効にします。これにより、実行が少し遅くなりますが、_DEBUG定義がまだ設定されていない限り、これは通常のデバッグよりも高速になります。その後、かなり良いデバッグを行うことができます。 "#ifdef _DEBUG"やそれに類似するものはそこには存在しません(例えば、アサートなどの呼び出し)。このことができます

希望、

4

は、なぜあなたは自分のリリース構成にデバッグ情報をオンにしませんか?

+2

デバッグ情報はすでにリリースで有効になっています。問題は、積極的な最適化のためにデバッガで多くの変数を読み取ることができないことです。 – pauldoo

0

どちらのVSをお使いですか?私たちは最近VS.netからVS2008に移行しました。そして、500kを超えるLOCプロジェクトでハイエンドマシンでデバッグするときに同じ遅さを経験しました。 Intellisenseのベースは壊れていて、それ自体は絶えず更新されていましたが、どこかで立ち往生してしまいます。 .ncbファイルを削除すると問題が解決しました。

1

MFCを使用していますか?

私の経験上、デバッグバージョンを遅くする主なことは、通常はリリース時に無効になっているクラス検証ルーチンです。データ構造がすべて木のようなものであれば、何百回もサブツリーの再検証が終了する可能性があります。

リリースビルドよりも10倍遅い場合、それは時間の1/10を必要な作業に費やしていることを意味し、9/10は何か他のことをしています。あなたがそれを待っている間、あなたはちょうど "一時停止"ボタンを押してコールスタックを見て、チャンスはあなたが問題が何であるかを正確に見ることができる9/10です。

It's a quick & dirty, but effective way to find performance problems.

4

私たちは、プリプロセッサシンボルとイテレータのデバッグをオフに:

_HAS_ITERATOR_DEBUGGING=0 
_SCL_SECURE=0 

をそれは少しを助けたが、それでも私たちは好きなように高速ではありませんでした。また、_DEBUGの代わりにNDEBUGを定義することにより、デバッグビルドをリリースのようにすることもできました。変更したオプションもいくつかありましたが、私はそれらを覚えていません。

私たちはこれをすべて実行する必要がありましたが、アプリケーションには50msごとに実行する必要があるか、使用できないようにする必要があります。VS2008をそのまま使用すると、デバッグでは60ms、リリースでは6msの時間がかかります。上記の調整を行うことで、少なくとも20ms程度のデバッグが可能になりました。これは少なくとも使用可能です。

+0

フラットアウト(タイマーではなく連続的に実行)させてください。その10:1デバッグ:あなたが見ているリリースの減速は、この手法で実際に見つけやすいものです。 http://stackoverflow.com/questions/375913/what-c​​an-i-use-to -profile-c-code-in-linux/378024#378024 –

+0

... 20:6の速度低下でさえ、それは時間の70%が無駄になることを意味します。したがって、10個のサンプルを取ると、7 +/- 1.45サンプルのスタック上の理由がわかります。スタックはなぜそれを行っているのかを示しますが、それは問題の原因になります。回避策を見つけることができます。 –

+0

私は実際にプロファイラを実行しました。問題はたくさんの方法に広がっていて、機能ヘッダーがいつも体を食べていないように見えました。これは、Visual Studioがデバッグモードで行っていた特別なチェックによるものだと私は結論づけました。 – MrSlippers

2

NDEBUGを定義し、有効に何の最適化を持っていないReleaseWithSymbolsコンフィギュレーションを作成します。これにより、デバッグのための正確なシンボルを維持しながら、より良いパフォーマンスを得ることができます。

関連する問題