2012-03-11 35 views
1

Visual Studioのデバッグモードでは約5分、リリースモードでは約10秒かかります。リリースコードよりも実行時間が数桁長くなるデバッグコード

プログラムの最後にデバッグする必要がある場合、プログラムがブレークポイントに到達するまでには時間がかかりすぎるため、これは大きな問題になります。

私はシリアライズを行い、boost :: serializeを使用してデバッグコードより前のすべての変数をシリアル化しましたが、それらの変数をすべてデシリアライズするには1〜2分かかります。

だから何ですか?私は、デバッグモードでコードを実行すると多くの最適化とインラインの処理が無効になることを知っていますが、デバッグモードでコードを実行するには約2桁の時間がかかります。プログラマーがこの待機時間を回避するために使用するハックや何かがありますか?多くのプログラムが私よりもはるかに計算量が多いことを知っていますが、デバッグコードがブレークポイントに達するのを5分待つことは非常に疑問です。

+1

ループ内に条件付きブレークポイントを置くと、処理時間が同様に増加することがわかりました(画像処理)。デバッガは、ブレークポイントの条件式を非常にループで評価しなければならず、大きな負荷になる可能性があります。たぶんあなたは似たようなものを持っています – Dampsquid

+0

私はdampsquidに同意します。メモリウォッチポイントはもう一つの大きな減速要因です。ブレークポイントやウォッチポイントなしで実行してみてください - どれくらい速いですか? – TonyK

+0

ブレークポイントを持たないデバッグで実行するのに要する時間と、ブレークポイントでデバッグするだけで約0.5秒の差があり、実行時間が5分以上の場合はそれほど意味がありません。 – user1262907

答えて

2

Visual Studioのデバッグモードでは約5分、リリースモードでは約10秒かかっています。

これは正常です。

だから何ですか?

デバッグモードでコードを実行すると、多くの最適化とインラインの処理が無効になることを認識しています。そのmsvcの挿入に加えてMANYサニティチェック、特にstlコンテナが関係している場合。たとえば、互換性のないイテレータ、std :: map内の比較コンパレータの不具合、その他多くの同様の問題について警告します。私はそれもある程度メモリの破損を検出し、バッファオーバーラン、std :: vectorなどの範囲外アクセスを検出すると思います。これは便利ですが、オーバーヘッドは大量です。その上に特定のプロファイラを投げ、10秒で30分かかります。そしてこれも正常です。

この待機時間を回避するためにプログラマーが使用するハックや何かがありますか?

脇にそれを使用する代わりに#1 excuse ...
からあなたはmingwの上であなたのコードのデバッグバージョンを構築できる - それは、健全性チェック(この種の)を挿入しません。
また、ソースSTLライブラリを調べて、これらの機能をすべて有効にするマクロを確認することもできます。無効にできる可能性は非常に高いです。上記のマクロは、msdnのどこかに記載されている可能性もあります。
デバッグモードの代替STL実装を試すことができます。 また、デバッグ情報でリリースモードを構築して代わりにデバッグすることもできます。

0

ここでは、デバッガが接続されていない状態でリリースビルドを実行するのが面倒だったのですが、VS2010の究極のもの(またエクスプレスでもあります)が見つかった場合、プログラムがクラッシュすると、デバッグするか、プログラムを終了します(ただし、これを実行する前に中止、再試行、または無視するかどうかを尋ねるメッセージが表示されます)。デバッグをクリックし、Visual Studioで現在開いているソリューションを選択すると、コードがロードされ、プログラムがデバッグされている間に発生したクラッシュ全体がふりまとめられます。

これは基本的に、ブレークポイントが必要なコードに意図的なグリッチを入れた場合、デバッガが接続されていない状態で高速リリースモードでコードを実行し、プログラムがクラッシュした後でデバッグを開始できることを意味します。クラッシュを強制する目的で、私は空のベクトルを作成し、空のベクトルの要素にアクセスしようとしました。

しかし、この方法には一度の使用であるという大きな欠点があります。プログラムがクラッシュしてデバッグを開始した後は、ウォッチリストやその他の変数を表示する以外に何もできません。つまり、デバッグが可能なプロセスを技術的に実行していないため、他のブレークポイントを設定することはできません。

確かに、それはかなり大きな後退ですが、それはメソッドがその用途を持たないことを意味しません。

0

デバッグする内容によって異なります。奇妙な動作を許容する準備ができている場合は、通常、デバッグするものをカスタマイズすることができます。リリースモードライブラリ(デバッグ情報を有効にしたまま)を使用して、最適化を有効にしてみてください。

関連する問題