47286


Visual Studioでは条件付きブレークポイントを使用して、特定の値でデバッグする時に役立てることができます。

しかし条件付きブレークポイントをうっかりforループに仕込むと、劇的に処理時間が増大してデバッガの停止が強制的に必要になる場合があります。  
もし条件付きブレークポイントで処理時間が大幅に増えなければ利用機会が増えて嬉しいのですが、IDEの設定などで対策はとれないものでしょうか。

下記は質問末尾のコードをVisual Studio Community 2017で実行した時の値です。  
(コンパイラのおかげか、IF文の有無や呼び出し順で処理時間が変動する興味深い結果となりましたが、今回の質問とは直接関係ないと思いますので質問としてはスルーします)

**デバッグ実行時間**

[code]

    ブレークポイントなし: 81 ms
    IF文の中にブレークポイント: 101 ms
    条件付きブレークポイント: 30884726 ms
    
[/code]

**通常実行(Ctrl+F5)時間**

[code]

    ブレークポイントなし: 77 ms
    IF文の中にブレークポイント: 86 ms
    条件付きブレークポイント: 69 ms
    
[/code]

結局遅い時はif文を使ってデバッグしたい値でブレークポイントを記述するのですが、何となく機能を活用し切れていない点と、デバッグ用コードが混入する点がモヤッとします。

下記のコードについては、停止しないブレークポイントを設定することで処理時間を計ります。

[code]

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(RunNormal());
                Console.WriteLine(RunIfBreak());
                Console.WriteLine(RunConditionalBreak());
                Console.ReadLine();
            }
    
            private static string RunNormal()
            {
                var stopwatch = new Stopwatch();
                stopwatch.Start();
                //単純に値を足すだけの処理
                var sum = 0;
                for(var i = 0; i < 10000; i++)
                {
                    sum += i;
                }
                return string.Format("ブレークポイントなし: {0} ms", stopwatch.ElapsedTicks);
            }
    
            private static string RunIfBreak()
            {
                var stopwatch = new Stopwatch();
                stopwatch.Start();
                //単純に値を足すだけの処理
                var sum = 0;
                for (var i = 0; i < 10000; i++)
                {
    #if DEBUG
                    if(i < 0)
                    {
                        Console.WriteLine("ここにブレークポイントを立てます");
                    }
    #endif
                    sum += i;
                }
                return string.Format("IF文の中にブレークポイント: {0} ms", stopwatch.ElapsedTicks);
            }
    
            private static string RunConditionalBreak()
            {
                var stopwatch = new Stopwatch();
                stopwatch.Start();
                //単純に値を足すだけの処理
                var sum = 0;
                for (var i = 0; i < 10000; i++)
                {
                    sum += i; //ここに条件付きブレークポイント(i < 0)を立てます
                }
                return string.Format("条件付きブレークポイント: {0} ms", stopwatch.ElapsedTicks);
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2018-08-06T12:20:23.417
47283
2018-08-06T13:08:56.160
9820
question
c# visual-studio
Visual Studio 2015以降の条件付きブレークポイントで低速化を防ぐ方法


デバッガは調査のための支援ツールであり、常用するものではありません。速度低下を憂う時点で使い方を誤っている可能性があります。  
例えばブレークポイントは一時的に無効化できます。（他のブレークポイントと組み合わせたりして）問題が発生し得るタイミングでのみ有効化すれば、ブレークポイントの条件評価の回数を抑えることができます。  
また本来は常に満たすべき条件のものを、稀に満たさない場合を見つけるのであれば条件付きブレークポイントではなく[`Debug.Assert`メソッド](https://msdn.microsoft.com/en-
us/library/kssw4w7z\(v=vs.110\).aspx)を使用して判定すべきです。  
if文判定で代用されているとのことですが、[`Debugger.Break()`メソッド](https://msdn.microsoft.com/ja-
jp/library/system.diagnostics.debugger.break\(v=vs.110\).aspx)を使用することでプログラム側からブレーク・停止することもできます。


CC BY-SA 4.0
2018-08-06T13:08:56.160
47286
2018-08-06T13:08:56.160
4236
47283
answer