Fouten opsporen in alleen gebruikerscode met Just My Code
Just My Code is een Visual Studio-debuggingfunctie die automatisch oproepen naar systeem-, framework- en andere niet-gebruikerscode overslaat. In het venster Aanroepstapel vouwt Just My Code deze aanroepen samen tot [Externe code]-frames.
Alleen Mijn code werkt anders in .NET- en C++-projecten.
Just My Code in- of uitschakelen
Voor de meeste programmeertalen is Just My Code standaard ingeschakeld.
- Als u Just My Code in Visual Studio wilt in- of uitschakelen, schakelt u onder Tools>Options (of Debug>Options) >Foutopsporing>Algemenein of uit Just My Code inschakelen.
Notitie
Just My Code inschakelen is een globale instelling die van toepassing is op alle Visual Studio-projecten in alle talen.
Alleen mijn code debuggen
Tijdens een foutopsporingssessie toont het venster Modules welke codemodules het foutopsporingsprogramma behandelt als Mijn code (gebruikerscode), samen met de laadstatus van het symbool. Zie voor meer informatie over hoe u vertrouwd kunt raken met het koppelen van het foutopsporingsprogramma aan uw app.
In het venster Call Stack of Tasks vouwt Just My Code de niet-gebruikerscode samen in een grijs gemarkeerd codeframe met het label [External Code]
.
Fooi
Als u de Moduleswilt openen, Stackaanroepen, Takenof de meeste andere foutopsporingsvensters, moet u zich in een foutopsporingssessie bevinden. Selecteer tijdens foutopsporing onder Foutopsporing>Windowsde vensters die u wilt openen.
Als u de code wilt weergeven in een samengevouwen [Externe code] kader, klikt u met de rechtermuisknop in het venster Aanroepstapel of Taak en selecteert u Externe code tonen in het contextmenu. De uitgevouwen externe coderegels vervangen het frame [Externe code].
Notitie
Externe code weergeven is een huidige gebruikersprofielinstelling die van toepassing is op alle projecten in alle talen die door de gebruiker worden geopend.
Wanneer u dubbelklikt op een uitgevouwen externe coderegel in het venster van de Aanroepstack, wordt de aanroepende coderegel in de broncode groen gemarkeerd. Voor DLL's of andere modules die niet zijn gevonden of geladen, kan een symbool of bronpagina worden geopend.
Vanaf versie 17.7 van Visual Studio 2022 kunt u .NET-code autodecompileren door te dubbelklikken op externe code in het Aanroepstack-venster. Zie Broncode genereren van .NET-assembly's tijdens foutopsporingvoor meer informatie.
.NET Alleen mijn code
In .NET-projecten gebruikt Just My Code symbool (.pdb) bestanden en programmaoptimalisaties om gebruikers- en niet-gebruikerscode te classificeren. Het .NET-foutopsporingsprogramma beschouwt geoptimaliseerde binaire bestanden en niet-geladen .pdb--bestanden als niet-gebruikerscode.
Drie compilerkenmerken hebben ook invloed op wat het .NET-foutopsporingsprogramma beschouwt als gebruikerscode:
- DebuggerNonUserCodeAttribute vertelt het foutopsporingsprogramma dat de code waarop deze wordt toegepast, geen gebruikerscode is.
- DebuggerHiddenAttribute maakt de code verborgen voor het foutopsporingsprogramma, zelfs als Just My Code is uitgeschakeld.
- DebuggerStepThroughAttribute vertelt de debugger om de code waarnaar deze wordt toegepast te doorlopen, in plaats van in de code te stappen.
Het .NET-foutopsporingsprogramma beschouwt alle andere code als gebruikerscode.
Tijdens foutopsporing in .NET:
- Fouten opsporen in>Stap in (of F11) bij stappen voor niet-gebruikerscode over de code naar de volgende regel gebruikerscode.
- Foutopsporing in>Step Out (of Shift+F11) op niet-gebruikerscode wordt uitgevoerd naar de volgende regel gebruikerscode.
Als er geen gebruikerscode meer is, wordt de debugging voortgezet totdat deze eindigt, een ander onderbrekingspunt bereikt of er een fout optreedt.
Als het foutopsporingsprogramma wordt onderbroken in niet-gebruikerscode (u gebruikt bijvoorbeeld Foutopsporing>Alle onderbreken en onderbreken in niet-gebruikerscode), wordt het venster Geen bron weergegeven. U kunt vervolgens een Debug>Step opdracht gebruiken om naar de volgende regel gebruikerscode te gaan.
Als er een niet-verwerkte uitzondering optreedt in niet-gebruikerscode, wordt de debugger onderbroken bij de regel in de gebruikerscode waar de uitzondering is gegenereerd.
Als eerste kans uitzonderingen zijn ingeschakeld voor een uitzondering, wordt de regel met gebruikerscode die de uitzondering oproept, groen gemarkeerd in de broncode. In het venster Aanroepstack wordt het geannoteerde frame [Externe code]weergegeven.
C++ Alleen mijn code
Vanaf Visual Studio 2017 versie 15.8 wordt Just My Code voor codestap ook ondersteund. Deze functie vereist ook het gebruik van de /JMC (Just my code debugging) compilerswitch. De schakeloptie is standaard ingeschakeld in C++-projecten. Voor Call Stack venster en call stack-ondersteuning in Just My Code is de /JMC-switch niet vereist.
Als u als gebruikerscode wilt worden geclassificeerd, moet de PDB voor het binaire bestand met de gebruikerscode worden geladen door het foutopsporingsprogramma (gebruik het venster Modules om de laadstatus te controleren).
Voor het gedrag van aanroepstacks, zoals in het Aanroepstackvenster, beschouwt Just My Code in C++ alleen deze functies als niet-gebruikerscode:
- Functies met gestreepte brongegevens in hun symbolenbestand.
- Functies waarin de symboolbestanden aangeven dat er geen bronbestand is dat overeenkomt met het stackframe.
- Functies die zijn opgegeven in *.natjmc bestanden in de map %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
Voor codestapgedrag houdt Just My Code in C++ alleen rekening met deze functies als niet-gebruikerscode:
- Functies waarvoor het bijbehorende PDB-bestand niet is geladen in het foutopsporingsprogramma.
- Functies die zijn opgegeven in *.natjmc bestanden in de map %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
Notitie
Voor ondersteuning voor codestappen in Just My Code moet C++-code worden gecompileerd met behulp van de MSVC-compilers in Visual Studio 15.8 Preview 3 of hoger en moet de schakeloptie /JMC-compiler zijn ingeschakeld (deze is standaard ingeschakeld). Zie C++-aanroepstack en codestapgedrag aanpassen en dit blogberichtvoor meer informatie. Voor code die is gecompileerd met een oudere compiler, zijn .natstepfilter bestanden de enige manier om codestappen aan te passen, wat onafhankelijk is van Just My Code. Zie Het stappengedrag van C++ aanpassen.
Tijdens foutopsporing in C++ wordt niet-gebruikerscode standaard overgeslagen. Tijdens C++ foutopsporing:
- Fouten opsporen in>Stap in (of F11) bij niet-gebruikerscode stapt over de code of gaat naar de volgende regel van gebruikerscode als Stap in wordt aangeroepen vanuit niet-gebruikerscode.
- Foutopsporing>Step Out (of Shift+F11) op niet-gebruikerscode wordt uitgevoerd naar de volgende regel gebruikerscode (buiten het huidige stackframe).
Als er geen gebruikerscode meer is, wordt de foutopsporing voortgezet totdat deze eindigt, een ander onderbrekingspunt bereikt, of een fout optreedt.
Als het foutopsporingsprogramma wordt onderbroken in niet-gebruikerscode (u gebruikt bijvoorbeeld Foutopsporing>Alle verbreken en onderbreken in niet-gebruikerscode), gaat u verder met het stapje niet-gebruikerscode.
Als het foutopsporingsprogramma een uitzondering treft, stopt het bij de uitzondering, of het nu in gebruikers- of niet-gebruikerscode is. Niet-door-gebruiker-verwerkte opties in het dialoogvenster Uitzonderingsinstellingen worden genegeerd.
Gedrag van C++-aanroepstack en codestap aanpassen
Voor C++-projecten kunt u de modules, bronbestanden en functies opgeven die in het venster Aanroepstack als niet-gebruikerscode worden behandeld door ze op te geven in *.natjmc bestanden. Deze aanpassing is ook van toepassing op codestappen als u de nieuwste compiler gebruikt (zie C++ Just My Code).
- Als u niet-gebruikerscode wilt opgeven voor alle gebruikers van de Visual Studio-computer, voegt u het .natjmc-bestand toe aan de map %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
- Als u niet-gebruikerscode voor een afzonderlijke gebruiker wilt opgeven, voegt u het bestand .natjmc toe aan de map %USERPROFILE%\Mijn Documenten\<Visual Studio-versie>\Visualizers.
Een .natjmc-bestand is een XML-bestand met deze syntaxis:
<?xml version="1.0" encoding="utf-8"?>
<NonUserCode xmlns="http://schemas.microsoft.com/vstudio/debugger/jmc/2015">
<!-- Modules -->
<Module Name="ModuleSpec" />
<Module Name="ModuleSpec" Company="CompanyName" />
<!-- Files -->
<File Name="FileSpec"/>
<!-- Functions -->
<Function Name="FunctionSpec" />
<Function Name="FunctionSpec" Module ="ModuleSpec" />
<Function Name="FunctionSpec" Module ="ModuleSpec" ExceptionImplementation="true" />
</NonUserCode>
kenmerken van module-element
Attribuut | Beschrijving |
---|---|
Name |
Vereist. Het volledige pad van de module of de modules. U kunt de Windows-jokertekens ? (nul of één teken) en * (nul of meer tekens) gebruiken. Bijvoorbeeld<Module Name="?:\3rdParty\UtilLibs\*" /> vertelt het foutopsporingsprogramma om alle modules op elke schijf in \3rdParty\UtilLibs als externe code te behandelen. |
Company |
Facultatief. De naam van het bedrijf dat de module publiceert die is ingesloten in het uitvoerbare bestand. U kunt dit kenmerk gebruiken om de modules ondubbelzinnig te maken. |
kenmerken van bestandselementen
Attribuut | Beschrijving |
---|---|
Name |
Vereist. Het volledige pad van het bronbestand of de bestanden die moeten worden behandeld als externe code. U kunt de Jokertekens van Windows ? en * gebruiken bij het opgeven van het pad. |
kenmerken van functie-element
Attribuut | Beschrijving |
---|---|
Name |
Vereist. De volledig gekwalificeerde naam van de functie die moet worden behandeld als externe code. u kunt de Windows-jokertekens ? en * gebruiken bij het opgeven van het pad. |
Module |
Facultatief. De naam of het volledige pad naar de module die de functie bevat. U kunt dit kenmerk gebruiken om functies met dezelfde naam te ontkoppelen. |
ExceptionImplementation |
Als deze optie is ingesteld op true , geeft de aanroepstack de functie weer die de uitzondering heeft veroorzaakt in plaats van deze functie. |
C++ stapgedrag aanpassen onafhankelijk van Just My Code-instellingen
In C++-projecten kunt u functies opgeven die u wilt doorlopen door ze als NoStepInto functies in *.natstepfilter bestanden weer te geven. Functies die worden vermeld in *.natstepfilter bestanden zijn niet afhankelijk van Alleen Mijn code-instellingen. Een NoStepInto-functie vertelt het foutopsporingsprogramma om de functie over te slaan, zelfs als enkele StepInto-functies of andere gebruikerscode aangeroepen worden. In tegenstelling tot functies die worden vermeld in .natjmc, stapt het foutopsporingsprogramma in de eerste regel van gebruikerscode binnen in de functie NoStepInto.
- Als u niet-gebruikerscode wilt opgeven voor alle lokale Visual Studio-gebruikers, voegt u het bestand .natstepfilter toe aan de map %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
- Als u niet-gebruikerscode voor afzonderlijke gebruikers wilt opgeven, voegt u het bestand .natstepfilter toe aan de %USERPROFILE%\Mijn Documenten\<map van Visual Studio versie>\Visualizers.
Notitie
Sommige extensies van derden kunnen .natstepfilter functionaliteit uitschakelen.
Een .natstepfilter bestand is een XML-bestand met deze syntaxis:
<?xml version="1.0" encoding="utf-8"?>
<StepFilter xmlns="http://schemas.microsoft.com/vstudio/debugger/natstepfilter/2010">
<Function>
<Name>FunctionSpec</Name>
<Action>StepAction</Action>
</Function>
<Function>
<Name>FunctionSpec</Name>
<Module>ModuleSpec</Module>
<Action>StepAction</Action>
</Function>
</StepFilter>
Element | Beschrijving |
---|---|
Function |
Vereist. Hiermee geeft u een of meer functies op als niet-gebruikersfuncties. |
Name |
Vereist. Een met ECMA-262 opgemaakte reguliere expressie die de volledige functienaam aangeeft die overeenkomt. Bijvoorbeeld:<Name>MyNS::MyClass::.*</Name> vertelt het foutopsporingsprogramma dat alle methoden in MyNS::MyClass als niet-gebruikerscode moeten worden beschouwd. De vergelijking is hoofdlettergevoelig. |
Module |
Facultatief. Een met ECMA-262 opgemaakte reguliere expressie die het volledige pad naar de module met de functie aangeeft. De overeenkomst is niet hoofdlettergevoelig. |
Action |
Vereist. Een van deze hoofdlettergevoelige waarden:NoStepInto - beveelt de debugger om de functie over te slaan.StepInto : geeft aan dat de debugger in de functie treedt, waarbij alle andere NoStepInto voor de overeenkomende functie worden overschreven. |
Aanvullende informatie over .natstepfilter- en .natjmc-bestanden
Vanaf Visual Studio 2022 versie 17.6 kunt u .natjmc en .natstepfilter bestanden rechtstreeks toevoegen aan de oplossing of het project.
Syntaxisfouten in .natstepfilter en .natjmc-bestanden worden niet gerapporteerd in het uitvoervenster van het foutopsporingsprogramma.
In tegenstelling tot .natvis- bestanden, worden .natstepfilter- en .natjmc-bestanden niet dynamisch opnieuw geladen. In plaats daarvan worden deze bestanden opnieuw geladen aan het begin van de foutopsporingssessie.
Voor sjabloonfuncties kan het gebruik van
<.*>
of<.*
in de naam nuttig zijn.
JavaScript Alleen Mijn Code
Voor .esproj projecten in Visual Studio 2022 gebruikt Visual Studio Code een launch.json-bestand om het foutopsporingsprogramma te configureren en aan te passen. launch.json is een configuratiebestand voor foutopsporingsprogramma's.
Visual Studio koppelt het foutopsporingsprogramma alleen aan gebruikerscode. Voor .esproj projecten kunt u gebruikerscode (dat wil gezegd Just My Code-instellingen) configureren in Visual Studio met behulp van de skipFiles
-instelling in launch.json. Deze instelling werkt hetzelfde als de launch.json-instellingen in VS Code. Voor meer informatie over skipFiles, zie Het overslaan van oninteressante code.