One thing that comes to me sometimes when I am debugging a program is to see a variable that has changed value, but I don't know where and when it was changed. That leaded me to long and boring sessions of debugging, checking where the variable could have its changed.
I just wanted some kind of breakpoint that I could set that told me "break when this variable changes value", but Visual Studio never had such a feature. Until now.
With .Net Core 3.0, Microsoft introduced a new feature in Visual Studio that will enhance a lot the debugging experience. The only drawback is that it only works with .Net Core 3.0 apps. But, nevertheless, it's a great, long waited feature!
This feature is a little buried in Visual Studio (no, there is no right-click in a variable name with something like "break when this variable value changes"), so how do I set a data breakpoint?
To show this feature, I will use a .Net Core console app that gets the prime numbers:
static void Main(string[] args)
{
if (args.Length < 1)
{
Console.WriteLine("usage: GetPrimesLessThan <number>");
return;
}
if (!int.TryParse(args[0], out int number))
{
Console.WriteLine("parameter should be a valid integer number");
return;
}
var primes = GetPrimesLessThan(number);
Console.WriteLine($"Found {primes.Length} primes less than {number}");
Console.WriteLine($"Last prime last than 10000 is {primes.Last()}");
}
private static int[] GetPrimesLessThan(int maxValue)
{
if (maxValue <= 1)
return new int[0];
;
var primeArray = Enumerable.Range(0, maxValue).ToArray();
var sizeOfArray = primeArray.Length;
primeArray[0] = primeArray[1] = 0;
for (int i = 2; i < Math.Sqrt(sizeOfArray - 1) + 1; i++)
{
if (primeArray[i] <= 0) continue;
for (var j = 2 * i; j < sizeOfArray; j += i)
primeArray[j] = 0;
}
return primeArray.Where(n => n > 0).ToArray();
}
This algorithm uses an array of integers that are set to zero if the number is not prime. At the end, all non prime numbers in the array are set to zero, so I can extract the primes with this linq line:
return primeArray.Where(n => n > 0).ToArray();
Let's say that I want to know when the number 10 changes to 0. If I didn't have this feature, I would have to follow the code, set breakpoints and analyze the data for every hit. Not anymore.
Here's what must be done:
- Set a breakpoint in the line just after the PrimeArray declaration
- Run the code and let it break.
- Open the Locals Window and expand the PrimeArray node
- Right Click on the node with the value 10
- Select Break when Value Changes
That's it! You have set a data breakpoint for the value 10 in the array. Now let the code run, when the value changes, the code will break:
There you can analyze your code and see what has changed the variable. Nice, no?
This is a great feature and will enhance a lot my debugging, I'm glad that Visual Studio people could add it. I hope that you'll enjoy it as much as I do.
The source code for the used project is at https://github.com/bsonnino/DataBreakpoint