Debuggen met breakpoints in Visual Studio
Het ontwikkelen van applicaties bestaat voor een groot gedeelte uit het oplossen van problemen en het vinden en verhelpen van vreemde bugs. Er zijn hier veel hulpmiddelen en strategieën voor. Je kan foutmeldingen loggen via speciale tools daarvoor, of foutmeldingen mailen; je kan debug messages printen in de applicatie, die je kan lezen terwijl het product draait.
In de meeste IDE's, waaronder ook in Visual Studio, kan je door de code van een applicatie stappen en breakpoints zetten. Visual Studio bevat een aantal mogelijkheden waarmee het debuggen nog gemakkelijker wordt gemaakt.
Breakpoints
Breakpoints plaats je met de muis door naast een regel te klikken of door F9 in te toetsen. Op dezelfde manier verwijder je de breakpoint.
Voorbeeldcode:
static void Main(string[] args)
{
int j = 10;
for (var i = 0; i < j; i++)
{
doeIetsMet(i);
}
nogEenFunction();
}
private static void doeIetsMet(int i)
{
var x = i;
}
private static void nogEenFunction()
{
doeIetsMet(51);
}
De code stopt als de breakpoint bereikt wordt. Soms wil je echter niet dat de code altijd stopt, maar alleen onder bepaalde voorwaarden. Je kan hiervoor de optie Conditions gebruiken en dan Conditional Expression. Bijvoorbeeld alleen stoppen als j gelijk is aan 10. Je kan elke boolean expressie gebruiken.
Met de optie Hit Count kan je in een loop bij een breakpoint stoppen als het aantal doorlopen items gelijk is aan, een meervoud van of groter dan of gelijk aan een bepaald getal is. Dus elke 3 iteraties stoppen, bijvoorbeeld.
Naast Conditions kan je ook Actions instellen. Dat zijn handelingen die uitgevoerd worden wanneer de code breakpoint bereikt en als een conditie is ingesteld, alleen voorwaardelijk. Je kan tekst loggen in het debug-venster op de manier en in die tekst variabelen verwerken.
Niet alleen kan je die variabelen verwerken in je tekst, maar omdat de tekst als code wordt geevalueerd, kan je ze via deze functionaliteit ook dynamisch aanpassen. En op die manier kan je een eenvoudig je code debuggen, zonder de code zelf aan te passen.
Heb je een aantal condities en acties ingesteld, dan ben je die kwijt als je een breakpoint verwijdert. Je kan een breakpoint behouden maar uitschakelen door er met de rechtermuisknop op te klikken en daarvoor te kiezen of via Ctrl-F9.
Voorbeeld van gebruik condities en acties
Stel je voor dat een bepaalde functie een probleem geeft (maar niet per se een foutmelding) wanneer een waarde meer dan 50 is. Deze functie wordt echter door verschillende andere functies aangeroepen en misschien door verschillende threads. Zie wederom de voorbeeldcode hierboven. Lastig te debuggen.
We kunnen het debuggen gemakkelijker maken door een breakpoint te zetten in doeIetsMet en de conditie mee te geven van _i > 50_ en als actie zet je dan $CALLSTACK erin. In de Debug Window staat nu de callstack en weet je dus dat de problematische waarde vanuit de functie nogEenFunctie komt.