Felsök endast användarkod med Just My Code
Just My Code är en Visual Studio-felsökningsfunktion som automatiskt går över anrop till system, ramverk och annan icke-användarkod. I fönstret Call Stack döljer Just My Code dessa anrop i [extern kod] bildrutor.
Just My Code fungerar annorlunda i .NET- och C++-projekt.
Aktivera eller inaktivera Just My Code
För de flesta programmeringsspråk är Just My Code aktiverat som standard.
- Om du vill aktivera eller inaktivera Just My Code i Visual Studio går du till Tools>Options (eller Debug>Options) >Debugging>General, väljer eller avmarkerar du Enable Just My Code.
Obs!
Enable Just My Code är en global inställning som gäller för alla Visual Studio-projekt på alla språk.
Felsökning endast av min egen kod
Under en felsökningssession visar fönstret Moduler vilka kodmoduler som felsökaren behandlar som Min kod (användarkod) tillsammans med deras symbolinläsningsstatus. Mer information finns i Bekanta dig med hur felsökningsprogrammet ansluter till din app.
I fönstret Anropsstack eller Uppgifter döljer Just My Code icke-användarkod i en gråmarkerad kommenterad kodram märkt [External Code]
.
Tips
För att öppna Modulerna, Samtalsstack, Uppgiftereller de flesta andra felsökningsfönster måste du vara i en felsökningssession. Under felsökning under Felsöka>Windowsväljer du de fönster som du vill öppna.
Om du vill visa koden i en hopfälld [extern kod] ram, högerklicka i Anropsstack eller Aktivitetsfönster och välj Visa extern kod från innehållsmenyn. De expanderade externa kodraderna ersätter ramen [Extern kod] .
Not
Visa extern kod är en aktuell användarprofileringsinställning som gäller för alla projekt på alla språk som öppnas av användaren.
Om du dubbelklickar på en expanderad extern kodrad i fönstret Anropsstack, markeras den anropande kodraden i grönt i källkoden. För DLL:er eller andra moduler som inte hittas eller läses in kan en sida öppnas där symbol eller källa inte hittades.
Från och med Visual Studio 2022 version 17.7 kan du automatisktdekompilera .NET-kod genom att dubbelklicka på extern kod i fönstret Samtalsstack. Mer information finns i Generera källkod från .NET-sammansättningar vid felsökning.
.NET Bara min kod
I .NET-projekt använder Just My Code symbolfiler (.pdb) och programoptimeringar för att klassificera användar- och icke-användarkod. .NET-felsökaren anser att optimerade binärfiler och icke-inlästa .pdb filer är icke-användarkod.
Tre kompilatorattribut påverkar också vad .NET-felsökaren anser vara användarkod:
- DebuggerNonUserCodeAttribute meddelar felsökaren att koden som den tillämpas på inte är användarkod.
- DebuggerHiddenAttribute döljer koden från felsökningsprogrammet, även om Just My Code är inaktiverat.
- DebuggerStepThroughAttribute uppmanar felsökaren att gå igenom koden som den tillämpas på i stället för att gå in i koden.
.NET-felsökaren anser att all annan kod är användarkod.
Under .NET-felsökning:
- Felsöka>Gå in i (eller F11) i steg i icke-användarkod kliver över koden till nästa rad med användarkod.
- Felsöka>Steg ut (eller Skift+F11) på icke-användarkod körs till nästa rad med användarkod.
Om det inte finns någon mer användarkod fortsätter felsökningen tills den slutar, träffar en annan brytpunkt eller utlöser ett fel.
Om felsökningsprogrammet bryts i icke-användarkod (du till exempel använder Felsöka>Bryt alla och pausa i icke-användarkod) visas fönstret Ingen källa. Du kan sedan använda kommandot Debug>Step för att gå till nästa rad med användarkod.
Om ett ohanterat undantag inträffar i icke-användarkod bryts felsökningsprogrammet på användarkodraden där undantaget genererades.
Om undantag från första chansen är aktiverade för undantaget markeras den anropande användarkodraden i grönt i källkoden. Fönstret Call Stack visar den annoterade ramen märkt [Extern kod].
C++ Bara min kod
Från och med Visual Studio 2017 version 15.8 stöds även Just My Code för steganalysering i koden. Den här funktionen kräver också användning av /JMC (bara min kodfelsökning) kompilatorväxel. Växeln är aktiverad som standard i C++-projekt. För Anropsstack-fönstret och stöd för anropsstack i Just My Code krävs inte /JMC-växeln.
För att klassificeras som användarkod måste PDB för binärfilen som innehåller användarkoden läsas in av felsökningsprogrammet (använd fönstret Moduler för att kontrollera inläsningsstatusen).
För anropsstackens beteende, till exempel i fönstret Anropsstack, anser Just My Code i C++ att endast dessa funktioner är icke-användarkod:
- Funktioner med avskalad källinformation i symbolfilen.
- Funktioner där symbolfilerna anger att det inte finns någon källfil som motsvarar stackramen.
- Funktioner som anges i *.natjmc filer i mappen %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
För kodstegningsbeteende betraktar Just My Code i C++ endast dessa funktioner som icke-användarkod:
- Funktioner som motsvarande PDB-fil inte har lästs in för i felsökningsprogrammet.
- Funktioner som anges i *.natjmc filer i mappen %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
Anteckning
För stöd för kodstegning i Just My Code måste C++-koden kompileras med MSVC-kompilatorerna i Visual Studio 15.8 Preview 3 eller senare, och /JMC-kompilatorväxeln måste vara aktiverad (den är aktiverad som standard). Mer information finns i Anpassa C++-samtalsstack och kodstegningsbeteende och det här blogginlägget. För kod som kompilerats med hjälp av en äldre kompilator är .natstepfilter filer det enda sättet att anpassa kodstegning, som är oberoende av Just My Code. Se Anpassa C++-stegbeteende.
Vid felsökning av C++ ignoreras icke-användarkod automatiskt. Under C++-felsökning:
- Felsöka>Steg till (eller F11) i steg som inte är användarkodsteg över koden eller körs till nästa rad med användarkod, om Steg in i anropas från icke-användarkod.
- Felsöka>Steg ut (eller Skift+F11) på kod som inte är användarkod körs till nästa rad med användarkod (utanför den nuvarande stackramen).
Om det inte finns någon mer användarkod fortsätter felsökningen tills den slutar, träffar en annan brytpunkt eller utlöser ett fel.
Om felsökningsprogrammet bryter i kod som inte är användarkod (till exempel om du använder Debug>Bryt alla och pausar i icke-användarkod), fortsätter stegningen i den icke-användarkoden.
Om debuggern stöter på ett undantag, stannar den vid undantaget, oavsett om det finns i användar- eller icke-användarkod. alternativ för som inte hanteras av användaren i dialogrutan undantagsinställningar ignoreras.
Anpassa C++-samtalsstacken och kodstegningsbeteendet
För C++-projekt kan du ange moduler, källfiler och funktioner som Anropa Stack--fönstret behandlar som icke-användarkod genom att ange dem i *.natjmc filer. Den här anpassningen gäller även för kodstegning om du använder den senaste kompilatorn (se C++ Just My Code).
- Om du vill ange icke-användarkod för alla användare av Visual Studio-datorn lägger du till filen .natjmc i mappen %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
- Om du vill ange icke-användarkod för en enskild användare lägger du till filen .natjmc i mappen %USERPROFILE%\My Documents\<Visual Studio>\Visualizers.
En .natjmc- fil är en XML-fil med den här syntaxen:
<?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>
elementattribut för module
Attribut | Beskrivning |
---|---|
Name |
Krävs. Den fullständiga sökvägen för modulen eller modulerna. Du kan använda Windows jokertecken ? (noll eller ett tecken) och * (noll eller fler tecken). Till exempel<Module Name="?:\3rdParty\UtilLibs\*" /> instruerar felsökaren att behandla alla moduler i \3rdParty\UtilLibs på valfri enhet som extern kod. |
Company |
Valfri. Namnet på företaget som publicerar modulen som är inbäddad i den körbara filen. Du kan använda det här attributet för att skilja modulerna åt. |
Filelementattribut
Attribut | Beskrivning |
---|---|
Name |
Krävs. Den fullständiga sökvägen till källfilen eller filerna som ska behandlas som extern kod. Du kan använda Windows jokertecken ? och * när du anger sökvägen. |
Funktionselementattribut
Attribut | Beskrivning |
---|---|
Name |
Krävs. Det fullständigt kvalificerade namnet på funktionen som ska behandlas som extern kod. ou kan använda Windows jokertecken ? och * när du anger sökvägen. |
Module |
Valfri. Namnet eller den fullständiga sökvägen till modulen som innehåller funktionen. Du kan använda det här attributet för att skilja funktioner med samma namn. |
ExceptionImplementation |
När den är inställd på true visar anropsstacken den funktion som utlöste undantaget i stället för den här funktionen. |
Anpassa C++ stegbeteende oberoende av Just My Code-inställningar
I C++-projekt kan du specificera funktioner att hoppa över genom att lista dem som NoStepInto-funktioner i *.natstepfilter-filernas filer. Funktioner som anges i *.natstepfilter-filerna är inte beroende av Just My Code-inställningar. En NoStepInto-funktion instruerar felsökaren att gå över funktionen, även om den anropar vissa StepInto-funktioner eller annan användarkod. Till skillnad från funktioner som anges i .natjmcgår felsökningsprogrammet in i den första raden med användarkod i funktionen NoStepInto.
- Om du vill ange icke-användarkod för alla lokala Visual Studio-användare lägger du till filen .natstepfilter i mappen %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
- Om du vill ange icke-användarkod för en enskild användare lägger du till filen .natstepfilter i mappen %USERPROFILE%\My Documents\<Visual Studio>\Visualizers.
Anteckning
Vissa tillägg från tredje part kan inaktivera .natstepfilter funktioner.
En .natstepfilter fil är en XML-fil med den här syntaxen:
<?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 | Beskrivning |
---|---|
Function |
Krävs. Anger en eller flera funktioner som icke-användarfunktioner. |
Name |
Krävs. Ett ECMA-262-formaterat reguljärt uttryck som anger det fullständiga funktionsnamnet som ska matchas. Till exempel:<Name>MyNS::MyClass::.*</Name> meddelar felsökaren att alla metoder i MyNS::MyClass ska betraktas som icke-användarkod. Matchningen är skiftlägeskänslig. |
Module |
Valfri. Ett ECMA-262-formaterat reguljärt uttryck som anger den fullständiga sökvägen till modulen som innehåller funktionen. Matchningen är skiftlägesokänslig. |
Action |
Krävs. Ett av följande skiftlägeskänsliga värden:NoStepInto – instruerar felsökaren att steppa över funktionen.StepInto – instruerar felsökaren att gå in i funktionen och åsidosätta andra NoStepInto för den matchade funktionen. |
Ytterligare information om .natstepfilter-- och .natjmc--filer
Från och med Visual Studio 2022 version 17.6 kan du lägga till .natjmc- och .natstepfilter filer direkt till lösningen eller projektet.
Syntaxfel i .natstepfilter och .natjmc filer rapporteras inte i felsökningsprogrammets utdatafönster.
Till skillnad från .natvis-filer, laddas .natstepfilter och .natjmc-filer inte om automatiskt. I stället laddas dessa filer in igen i början av felsökningssessionen.
För mallfunktioner kan det vara bra att använda
<.*>
eller<.*
i namnet.
JavaScript bara min kod
För .esproj- projekt i Visual Studio 2022 använder Visual Studio Code en launch.json-fil för att konfigurera och anpassa felsökningsprogrammet. launch.json är en konfigurationsfil för felsökningsprogrammet.
Visual Studio kopplar endast felsökningsprogrammet till användarkoden. För .esproj- projekt kan du konfigurera användarkod (d.v.s. Inställningar för Just My Code) i Visual Studio med hjälp av inställningen skipFiles
i launch.json. Den här inställningen fungerar på samma sätt som inställningarna för launch.json i VS Code. Mer information om skipFilesfinns i Hoppa över ointressant kod.