Het juiste type onderbrekingspunt gebruiken
In dit artikel wordt beschreven hoe u verschillende typen onderbrekingspunten in Visual Studio gebruikt om de efficiëntie van foutopsporing te verbeteren. Het behandelt verschillende scenario's waarin onderbrekingspunten kunnen worden toegepast, zoals het onderbreken van de uitvoering van code, logboekinformatie en het bijhouden van wijzigingen in variabele statussen. In het artikel wordt uitgelegd hoe u voorwaardelijke onderbrekingspunten, traceringen, gegevensonderbrekingspunten, afhankelijke onderbrekingspunten en tijdelijke onderbrekingspunten instelt. Het bevat ook gedetailleerde instructies voor het instellen van functie-onderbrekingspunten. Deze handleiding is essentieel voor ontwikkelaars die onderbrekingspunten willen gebruiken voor effectieve foutopsporing in Visual Studio.
Als u niet bekend bent met het gebruik van onderbrekingspunten in Visual Studio, raadpleegt u Aan de slag met onderbrekingspunten voordat u dit artikel doorloopt.
Voor de beste ervaring met deze documentatie kiest u de gewenste ontwikkeltaal of runtime in de lijst bovenaan het artikel.
Scenario's
De volgende tabel bevat veelvoorkomende foutopsporingsscenario's voor onderbrekingspunten en het aanbevolen onderbrekingspunttype voor het scenario.
Scenario | Beschrijving |
---|---|
Hoe onderbreek ik de actieve code om een coderegel te inspecteren die mogelijk een bug bevat? | Stel een onderbrekingspunt in. Zie Aan de slag met onderbrekingspuntenvoor meer informatie. |
Heeft mijn variabele een onverwachte waarde? Of wil ik mijn app inspecteren wanneer deze een specifieke status bereikt? | Probeer een voorwaardelijk onderbrekingspunt om te bepalen waar en wanneer een onderbrekingspunt wordt geactiveerd met behulp van voorwaardelijke logica. Klik met de rechtermuisknop op een onderbrekingspunt om voorwaarden toe te voegen. Stel de voorwaarde in op 'waar' wanneer de variabele gelijk is aan de onverwachte waarde. Zie voorwaarden voor onderbrekingspuntenvoor meer informatie. |
Hoe kan ik gegevens vastleggen in het uitvoervenster onder configureerbare omstandigheden zonder mijn code te wijzigen of te stoppen? | Met tracepoints kunt u gegevens onder configureerbare omstandigheden vastleggen in het uitvoervenster zonder de code te wijzigen of te stoppen. Zie Tracepoints gebruiken in het Visual Studio-foutopsporingsprogrammavoor meer informatie. |
Hoe weet ik wanneer de waarde van mijn variabele verandert? | Stel een gegevensbreekpunt in voor C++ . Voor apps die .NET Core 3 en hoger gebruiken, kunt u ook een gegevensonderbrekingspunt instellen. Anders kunt u alleen voor C# en F# een object-id bijhouden met een voorwaardelijk onderbrekingspunt. |
Hoe kan ik de uitvoering alleen verbreken als er een ander onderbrekingspunt wordt bereikt? | Stel een afhankelijk onderbrekingspunt in dat alleen de uitvoering onderbreekt als er eerst een ander onderbrekingspunt wordt bereikt. Zie Afhankelijk onderbrekingspuntvoor meer informatie. |
Kan ik maar één keer een onderbrekingspunt bereiken? | Stel een tijdelijk onderbrekingspunt in waarmee u de code slechts één keer kunt verbreken. Voor meer informatie, zie "Tijdelijk Breekpunt". |
Kan ik code in een lus onderbreken bij een bepaalde iteratie? | Stel een afhankelijk onderbrekingspunt in dat alleen de uitvoering onderbreekt als er eerst een ander onderbrekingspunt wordt bereikt. Voor meer informatie, zie Aantal treffers. |
Kan ik code aan het begin van een functie onderbreken wanneer ik de naam van de functie ken, maar niet de locatie ervan? | U kunt dit doen met een onderbrekingspunt voor een functie. Zie Functie-onderbrekingspunten instellenvoor meer informatie. |
Kan ik code aan het begin van meerdere functies met dezelfde naam onderbreken? | Wanneer u meerdere functies met dezelfde naam (overbelaste functies of functies in verschillende projecten) hebt, kunt u een functieonderbrekingspunt gebruiken. |
Onderbrekingspuntacties en traceringspunten
Een traceringspunt is een onderbrekingspunt dat een bericht naar het venster Uitvoer stuurt. Een tracepoint kan fungeren als een tijdelijke traceringsinstructie in de programmeertaal en onderbreekt de uitvoering van code niet. U maakt een traceringspunt door een speciale actie in te stellen in het venster Instellingen voor onderbrekingspunt. Zie Tracepoints gebruiken in het Visual Studio-foutopsporingsprogrammavoor gedetailleerde instructies.
Onderbrekingspuntvoorwaarden
U kunt bepalen wanneer en waar een onderbrekingspunt wordt uitgevoerd door voorwaarden in te stellen. De voorwaarde kan elke geldige expressie zijn die door het foutopsporingsprogramma wordt herkend. (Zie Expressies in het foutopsporingsprogrammavoor meer informatie over geldige expressies.)
Een onderbrekingspuntvoorwaarde instellen:
Klik met de rechtermuisknop op het onderbrekingspuntsymbool en selecteer Voorwaarden (of druk op Alt + F9-, C). Of beweeg de muisaanwijzer over het onderbrekingspuntsymbool, selecteer het pictogram Instellingen en selecteer vervolgens Voorwaarden in het venster Instellingen voor onderbrekingspunt.
U kunt ook met de rechtermuisknop in de linkermarge naast een regel code klikken en Voorwaardelijk onderbrekingspunt invoegen selecteren in het contextmenu om een nieuw voorwaardelijk onderbrekingspunt in te stellen.
U kunt ook voorwaarden instellen in het venster Onderbrekingspunten door met de rechtermuisknop op een onderbrekingspunt te klikken en Instellingente selecteren en vervolgens Voorwaarden
Selecteer in de vervolgkeuzelijst Voorwaardelijke expressie, Hit Countof Filteren stel de waarde dienovereenkomstig in.
Selecteer sluiten of druk op Ctrl+Enter- om het onderbrekingspuntinstellingen venster te sluiten. Of, vanuit het venster Onderbrekingspunten, selecteer OK om het dialoogvenster te sluiten.
Onderbrekingspunten met voorwaarden ingesteld worden weergegeven met een + symbool in de broncode en Onderbrekingspunten Vensters.
Een voorwaardelijke expressie maken
Wanneer u Voorwaardelijke expressieselecteert, kunt u kiezen tussen twee voorwaarden: Is waar of Wanneer gewijzigd. Kies Is waar om te breken wanneer de expressie waar is, of Wanneer gewijzigd om te breken wanneer de waarde van de expressie is gewijzigd.
In het volgende voorbeeld wordt het onderbrekingspunt alleen bereikt wanneer de waarde van testInt
is 4:
In het volgende voorbeeld wordt het onderbrekingspunt alleen bereikt wanneer de waarde van testInt
wordt gewijzigd:
Als u een onderbrekingspuntvoorwaarde met een ongeldige syntaxis instelt, wordt er een waarschuwingsbericht weergegeven. Als u een onderbrekingspuntvoorwaarde met een geldige syntaxis maar ongeldige semantiek opgeeft, wordt er een waarschuwingsbericht weergegeven wanneer het onderbrekingspunt voor het eerst wordt bereikt. In beide gevallen pauzeert de debugger wanneer het het ongeldige breekpunt bereikt. Het onderbrekingspunt wordt alleen overgeslagen als de voorwaarde geldig is en resulteert in false
.
Notitie
Voor de Wanneer het veld is gewijzigd, beschouwt het foutopsporingsprogramma niet de eerste evaluatie van de voorwaarde als een wijziging. Het onderbrekingspunt voor de eerste evaluatie wordt dus niet bereikt.
Object-id's gebruiken in voorwaardelijke expressies (alleen C# en F#)
Er zijn momenten waarop u het gedrag van een specifiek object wilt observeren. U wilt bijvoorbeeld weten waarom een object meer dan één keer is ingevoegd in een verzameling. In C# en F# kunt u object-id's maken voor specifieke exemplaren van verwijzingstypenen deze gebruiken in onderbrekingspuntvoorwaarden. De object-id wordt gegenereerd door de common language runtime (CLR) foutopsporingsservices en gekoppeld aan het object.
Een object-id maken:
Stel een onderbrekingspunt in de code in nadat het object is gemaakt.
Start foutopsporing en wanneer de uitvoering wordt onderbroken op het onderbrekingspunt, selecteert u Foutopsporing>Windows>Locals (of drukt u op Ctrl + Alt + V, L) om het Locals-venster te openen.
Zoek het specifieke objectexemplaar in het venster Locals, klik er met de rechtermuisknop op en selecteer Maak Object-ID.
U ziet een $ plus een getal in het venster Locals. Dit is de object-id.
Voeg een nieuw onderbrekingspunt toe op het punt dat u wilt onderzoeken; Bijvoorbeeld wanneer het object moet worden toegevoegd aan de verzameling. Klik met de rechtermuisknop op het onderbrekingspunt en selecteer Voorwaarden.
Gebruik de object-id in het veld Voorwaardelijke Uitdrukking. Als de variabele
item
bijvoorbeeld het object is dat moet worden toegevoegd aan de verzameling, selecteert u Is waar en typt u item == $<n>, waarbij <n> het object-id-nummer is.De uitvoering wordt verbroken op het moment dat dat object moet worden toegevoegd aan de verzameling.
Als u de object-id wilt verwijderen, klikt u met de rechtermuisknop op de variabele in het venster Locals en selecteert u Object-id verwijderen.
Notitie
Object-ID's maken zwakke verwijzingen en voorkomen niet dat het object door de garbage collector wordt verwijderd. Ze zijn alleen geldig voor de huidige foutopsporingssessie.
Een voorwaarde voor het aantal treffers instellen
Als u vermoedt dat een lus in uw code na een bepaald aantal iteraties verkeerd werkt, kunt u een onderbrekingspunt instellen om de uitvoering na dat aantal treffers te stoppen, in plaats van herhaaldelijk op F5 te drukken om die iteratie te bereiken.
Selecteer in het venster Instellingen voor onderbrekingspunt onder Voorwaarden de optie Aantal treffersen geef vervolgens het aantal iteraties op. In het volgende voorbeeld is het breekpunt ingesteld om bij elke tweede iteratie te stoppen.
Een filtervoorwaarde instellen
U kunt een breakpoint beperken om alleen te activeren op specifieke apparaten of in specifieke processen en threads.
Ga naar Voorwaarden in het venster Onderbrekingspuntinstellingen, selecteer Filteren voer vervolgens een of meer van de volgende expressies in:
- MachineName = "name"
- ProcessId = waarde
- ProcessName = "name"
- ThreadId = waarde
- ThreadName = "naam"
Plaats tekenreekswaarden tussen dubbele aanhalingstekens. U kunt componenten combineren met behulp van &
(AND), ||
(OR), !
(NOT) en haakjes.
Functieonderbrekingspunten instellen
U kunt de uitvoering verbreken wanneer een functie wordt aangeroepen. Dit is bijvoorbeeld handig als u de naam van de functie kent, maar niet de locatie. Het is ook handig als u functies met dezelfde naam hebt en u ze allemaal wilt verbreken (zoals overbelaste functies of functies in verschillende projecten).
Een onderbrekingspunt voor een functie instellen:
Selecteer Debug>New Breakpoint>Function Breakpointof druk op Ctrl + K, B.
U kunt ook Nieuw>functieonderbrekingspunt selecteren in het venster Onderbrekingspunten.
Voer in het dialoogvenster Nieuw Functieonderbrekingspunt de functienaam in het vak Functienaam in.
De functiespecificatie beperken:
Gebruik de volledig gekwalificeerde functienaam.
Voorbeeld:
Namespace1.ClassX.MethodA()
Voeg de parametertypen van een overbelaste functie toe.
Voorbeeld:
MethodA(int, string)
Gebruik het symbool '!' om de module op te geven.
Voorbeeld:
App1.dll!MethodA
Gebruik de contextoperator in systeemeigen C++.
{function, , [module]} [+<line offset from start of method>]
Voorbeeld:
{MethodA, , App1.dll}+2
Kies in de vervolgkeuzelijst Language de taal van de functie.
Selecteer OK-.
Een functieonderbrekingspunt instellen met behulp van een geheugenadres (alleen systeemeigen C++ )
U kunt het adres van een object gebruiken om een functieonderbrekingspunt in te stellen op een methode die wordt aangeroepen door een specifiek exemplaar van een klasse. Als u bijvoorbeeld een adresseerbaar object van het type my_class
hebt, kunt u een functieonderbrekingspunt instellen op de my_method
methode die instantie aanroept.
Stel ergens een onderbrekingspunt in na het instantiëren van het object van de klasse.
Zoek het adres van het exemplaar (bijvoorbeeld
0xcccccccc
).Selecteer Debug>New Breakpoint>Function Breakpointof druk op Ctrl + K, B.
Voeg het volgende toe aan het vak Functienaam en selecteer C++ taal.
((my_class *) 0xcccccccc)->my_method
Gegevensonderbrekingspunten instellen (.NET Core 3.x of .NET 5+)
Gegevensonderbrekingspunten onderbreken de uitvoering wanneer de eigenschap van een specifiek object verandert.
Een gegevensonderbrekingspunt instellen:
Begin in een .NET Core- of .NET 5+-project met foutopsporing en wacht totdat een onderbrekingspunt is bereikt.
Klik met de rechtermuisknop op een eigenschap in het venster Autos, Watchof Locals en selecteer Onderbreken bij waarde wijziging in het contextmenu.
Gegevensonderbrekingspunten voor .NET Core en .NET 5+ werken niet voor:
- Eigenschappen die niet kunnen worden uitgebreid in de knopinfo, het venster Locals, Autos of Watch
- Statische variabelen
- Klassen met het kenmerk DebuggerTypeProxy
- Velden in structuren
Zie hardwarelimieten voor gegevensonderbrekingspuntenvoor het maximum aantal dat u kunt instellen.
Gegevensonderbrekingspunten instellen (alleen voor systeemeigen C++)
Gegevensonderbrekingspunten onderbreken de uitvoering wanneer een waarde die is opgeslagen op een opgegeven geheugenadres verandert. Als de waarde wordt gelezen maar niet is gewijzigd, wordt de uitvoering niet verbroken.
Een gegevensonderbrekingspunt instellen:
Begin in een C++-project met foutopsporing en wacht totdat een onderbrekingspunt is bereikt. Kies in het Debug-menu de optie Nieuw Onderbrekingspunt>Gegevensonderbrekingspunt.
U kunt ook Nieuw>gegevensonderbrekingspunt selecteren in het venster onderbrekingspunten of met de rechtermuisknop op een item in het Autos, Bekijkenof Lokalen venster klikken en onderbreken bij waarde wijziging in het snelmenu selecteren.
Typ in het vak Adres een geheugenadres of een expressie die resulteert in een geheugenadres. Typ bijvoorbeeld
&avar
om te breken wanneer de inhoud van de variabeleavar
wordt gewijzigd.Selecteer in de vervolgkeuzelijst Byte Count het aantal bytes dat u door de debugger wilt laten controleren. Als u bijvoorbeeld 4selecteert, zal het foutopsporingsprogramma de vier bytes vanaf
&avar
in de gaten houden en zal stoppen als een van deze bytes hun waarde verandert.
Gegevensonderbrekingspunten werken niet onder de volgende omstandigheden:
- Een proces dat niet wordt gedebugd, schrijft naar de geheugenlocatie.
- De geheugenlocatie wordt gedeeld tussen twee of meer processen.
- De geheugenlocatie wordt bijgewerkt binnen de kernel. Als het geheugen bijvoorbeeld wordt doorgegeven aan de 32-bits Windows-
ReadFile
-functie, wordt het geheugen bijgewerkt vanuit de kernelmodus, zodat het foutopsporingsprogramma niet wordt onderbroken bij de update. - Waar de watch-expressie groter is dan 4 bytes bij 32-bits hardware en groter dan 8 bytes bij 64-bits hardware. Dit is een beperking van de x86-architectuur.
Notitie
Gegevensonderbrekingspunten zijn afhankelijk van specifieke geheugenadressen. Het adres van een variabele verandert van de ene foutopsporingssessie in de volgende, zodat gegevensonderbrekingspunten automatisch worden uitgeschakeld aan het einde van elke foutopsporingssessie.
Als u een gegevensonderbrekingspunt instelt op een lokale variabele, blijft het onderbrekingspunt ingeschakeld wanneer de functie eindigt, maar het geheugenadres niet meer van toepassing is, zodat het gedrag van het onderbrekingspunt onvoorspelbaar is. Als u een gegevensonderbrekingspunt instelt op een lokale variabele, moet u het onderbrekingspunt verwijderen of uitschakelen voordat de functie eindigt.
Hardwarelimieten voor gegevensonderbrekingen
De Windows-kernel en de onderliggende hardware hebben de volgende limieten bij het instellen van onderbrekingspunten voor gegevens. De limiet verwijst naar het maximum aantal onderbrekingspunten voor gegevens dat u kunt instellen.
Processorarchitectuur | Limiet voor gegevensonderbrekingspunten |
---|---|
x64 en x86 | 4 |
ARM64 | 2 |
ARM | 1 |
Een afhankelijk onderbrekingspunt instellen
Afhankelijke onderbrekingspunten onderbreken de uitvoering alleen als er eerst een ander onderbrekingspunt wordt bereikt. In een complex scenario, zoals het opsporen van fouten in een toepassing met meerdere threads, kunt u de extra onderbrekingspunten configureren nadat een ander onderbrekingspunt voor het eerst is bereikt. Dit kan foutopsporingscode in algemene paden, zoals gamelus of een hulpprogramma-API, veel eenvoudiger maken, omdat een onderbrekingspunt in deze functies kan worden geconfigureerd om alleen in te schakelen als de functie wordt aangeroepen vanuit een specifiek deel van uw toepassing.
Een afhankelijk onderbrekingspunt instellen:
Beweeg de muisaanwijzer over het onderbrekingspuntsymbool, kies het pictogram Instellingen en selecteer vervolgens Alleen inschakelen wanneer het volgende onderbrekingspunt wordt bereikt in het venster Instellingen voor onderbrekingspunten.
Selecteer in de vervolgkeuzelijst het vereiste onderbrekingspunt waaraan u het huidige onderbrekingspunt wilt laten afhangen.
Kies Sluiten of druk op Ctrl+Enter om het venster voor instellingen van onderbrekingspunten te sluiten. Of kies in het venster Onderbrekingspunten OK om het dialoogvenster te sluiten.
U kunt ook het contextmenu met de rechtermuisknop gebruiken om het afhankelijke onderbrekingspunt in te stellen.
Klik met de rechtermuisknop in de uiterste linkermarge naast een coderegel en selecteer Afhankelijk onderbrekingspunt invoegen in het contextmenu.
- Afhankelijke onderbrekingspunten werken niet als er slechts één onderbrekingspunt in uw toepassing is.
- Afhankelijke onderbrekingspunten worden geconverteerd naar normaal regelonderbrekingspunt als het vereiste onderbrekingspunt wordt verwijderd.
Een tijdelijk onderbrekingspunt instellen
Met dit onderbrekingspunt kunt u de code slechts eenmaal verbreken. Bij foutopsporing onderbreekt het Visual Studio-foutopsporingsprogramma de actieve toepassing slechts één keer voor dit onderbrekingspunt en verwijdert deze onmiddellijk nadat deze is bereikt.
Een tijdelijk onderbrekingspunt instellen:
Beweeg de muisaanwijzer over het onderbrekingspuntsymbool, kies het pictogram Instellingen en selecteer vervolgens Onderbrekingspunt verwijderen nadat u hebt bereikt in het venster Instellingen voor onderbrekingspunten.
Kies Sluiten of druk op Ctrl+Enter om het venster voor onderbrekingsinstellingen te sluiten. Of kies in het venster Onderbrekingspunten OK om het dialoogvenster te sluiten.
U kunt ook het contextmenu met de rechtermuisknop gebruiken om het tijdelijke onderbrekingspunt in te stellen.
Klik met de rechtermuisknop in de linkermarge naast een regel code en selecteer Tijdelijke onderbrekingspunt invoegen in het contextmenu.
Of gebruik de snelkoppeling F9 + Shift + Alt, T en stel het tijdelijke onderbrekingspunt in op de gewenste regel.