Ladění pouze uživatelského kódu pomocí just My Code

Just My Code je funkce ladění sady Visual Studio, která automaticky provádí kroky přes volání systému, architektury a jiného neuživatelého kódu. V okně Zásobník volání sbalí pouze můj kód tato volání do rámců [Externí kód].

Pouze můj kód funguje v projektech .NET a C++ odlišně.

Povolení nebo zakázání pouze mého kódu

U většiny programovacích jazyků je ve výchozím nastavení povolen pouze můj kód.

  • Pokud chcete povolit nebo zakázat pouze můj kód v sadě Visual Studio, v části Možnosti nástrojů>(nebo Možnosti ladění>)>> Obecné ladění vyberte nebo zrušte výběr možnosti Povolit pouze můj kód.

Snímek obrazovky s možností Povolit pouze můj kód v dialogovém okně Možnosti

Snímek obrazovky s možností Povolit pouze můj kód v dialogovém okně Možnosti

Poznámka:

Enable Just My Code je globální nastavení, které platí pro všechny projekty sady Visual Studio ve všech jazycích.

ladění s možností Pouze můj kód

Během ladicí relace okno Moduly ukazuje, které moduly kódu ladicí program považuje za Můj kód (uživatelský kód) spolu se stavem načítání symbolů. Další informace najdete v tématu Seznámení s připojením ladicího programu k aplikaci.

Snímek obrazovky uživatelského kódu v okně Moduly

Snímek obrazovky uživatelského kódu v okně Moduly

V okně Zásobník volání nebo Úkoly sbalí kód bez uživatele do šedě označeného rámečku [External Code]kódu s poznámkami .

Snímek obrazovky s externím kódem v okně Zásobník volání

Snímek obrazovky s externím kódem v okně Zásobník volání

Tip

Pokud chcete otevřít moduly, zásobník volání, úlohy nebo většinu dalších oken ladění, musíte být v ladicí relaci. Při ladění vyberte v části Ladicí>systém Windows okna, která chcete otevřít.

Pokud chcete zobrazit kód ve sbaleném rámečku [Externí kód], klikněte pravým tlačítkem do okna Zásobník volání nebo úkol a v místní nabídce vyberte Zobrazit externí kód . Rozbalené externí řádky kódu nahrazují rámec [Externí kód].

Snímek obrazovky s možností Zobrazit externí kód v okně Zásobník volání

Snímek obrazovky s možností Zobrazit externí kód v okně Zásobník volání

Poznámka:

Zobrazit externí kód je aktuální nastavení profileru uživatele, které platí pro všechny projekty ve všech jazycích, které uživatel otevřel.

Poklikáním na rozbalený řádek externího kódu v okně Zásobník volání se zvýrazní řádek volajícího kódu zelenou barvou ve zdrojovém kódu. U knihoven DLL nebo jiných modulů, které nebyly nalezeny nebo načteny, se může otevřít symbol nebo stránka zdroje, která nebyla nalezena.

Od sady Visual Studio 2022 verze 17.7 můžete kód .NET automaticky zkompilovat poklikáním na externí kód v okně Zásobník volání. Další informace naleznete v tématu Generování zdrojového kódu ze sestavení .NET při ladění.

.NET Just My Code

Vprojektechch Ladicí program .NET považuje optimalizované binární soubory a soubory .pdb, které nejsou načteny, jako uživatelský kód.

Tři atributy kompilátoru také ovlivňují, co ladicí program .NET považuje za uživatelský kód:

Ladicí program .NET považuje všechny ostatní kódy za uživatelský kód.

Během ladění .NET:

  • Krokovat>krok do (nebo F11) u kroků kódu bez uživatele přes kód na další řádek uživatelského kódu.
  • Ladění>kroku ven (nebo Shift+F11) na neuživatelovém kódu se spustí na další řádek uživatelského kódu.

Pokud neexistuje žádný další uživatelský kód, ladění pokračuje až do konce, přejde na jinou zarážku nebo vyvolá chybu.

Pokud ladicí program přeruší kód bez uživatele (například použijete příkaz Debug>Break All a pozastavíte ho v kódu bez uživatele), zobrazí se okno Bez zdroje. Potom můžete pomocí příkazu Krok ladění>přejít na další řádek uživatelského kódu.

Pokud dojde k neošetřené výjimce v neuživatelovém kódu, ladicí program se přeruší na řádku kódu uživatele, kde byla výjimka vygenerována.

Pokud jsou pro výjimku povoleny první náhodné výjimky, volající řádek uživatelského kódu se ve zdrojovém kódu zvýrazní zeleně. V okně Zásobník volání se zobrazí anotovaný rámeček označený jako [Externí kód].

C++ Just My Code

Počínaje sadou Visual Studio 2017 verze 15.8 se podporuje také krokování kódu just My Code for Code. Tato funkce také vyžaduje použití přepínače kompilátoru /JMC (pouze ladění kódu). Přepínač je ve výchozím nastavení povolen v projektech C++. Pro okno Zásobník volání a podporu zásobníku volání v just My Code není přepínač /JMC vyžadován.

Pokud chcete klasifikovat jako uživatelský kód, musí být soubor PDB binárního souboru obsahujícího uživatelský kód načten ladicím programem (zkontrolujte to pomocí okna Moduly ).

V případě chování zásobníku volání, jako je například v okně Zásobník volání, považuje just My Code v jazyce C++ pouze tyto funkce za kód, který není uživatelem:

  • Funkce s informacemi o zdroji v souboru symbolů.
  • Funkce, ve kterých soubory symbolů označují, že neexistuje žádný zdrojový soubor odpovídající rámečku zásobníku.
  • Funkce zadané v souborech *.natjmc ve složce %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers .

V případě chování krokování kódu považuje just My Code v jazyce C++ pouze tyto funkce za kód, který není uživatelem:

  • Funkce, pro které nebyl do ladicího programu načten odpovídající soubor PDB.
  • Funkce zadané v souborech *.natjmc ve složce %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers .

Poznámka:

Pro podporu krokování kódu v just My Code musí být kód C++ zkompilován pomocí kompilátorů MSVC v sadě Visual Studio 15.8 Preview 3 nebo novější a přepínač kompilátoru /JMC musí být povolený (ve výchozím nastavení je povolený). Další podrobnosti najdete v tématu Přizpůsobení zásobníku volání C++ a chování krokování kódu a tohoto blogového příspěvku. Pro kód zkompilovaný pomocí staršího kompilátoru jsou soubory .natstepfilter jediným způsobem, jak přizpůsobit krokování kódu, který je nezávislý na just My Code. Viz Přizpůsobení chování krokování jazyka C++.

Během ladění jazyka C++ se ve výchozím nastavení přeskočí kód bez uživatele. Během ladění jazyka C++:

  • Ladění>kroku do (nebo F11) u kroků kódu bez uživatele nebo spuštění na další řádek uživatelského kódu, pokud je krok do volána z kódu bez uživatele.
  • Ladění>kroku ven (nebo Shift+F11) na neuživatelovém kódu se spustí na další řádek uživatelského kódu (mimo aktuální rámec zásobníku).

Pokud neexistuje žádný další uživatelský kód, ladění pokračuje až do konce, přejde na jinou zarážku nebo vyvolá chybu.

Pokud ladicí program přeruší kód bez uživatele (například použijete příkaz Debug>Break All a pozastavíte ho v kódu bez uživatele), bude krokování pokračovat v kódu bez uživatele.

Pokud ladicí program dosáhne výjimky, zastaví se na výjimce, ať už je v uživatelském nebo neuživatelovém kódu. Možnosti neošetřené uživatelem v dialogovém okně Výjimka Nastavení jsou ignorovány.

Přizpůsobení zásobníku volání C++ a chování krokování kódu

U projektů C++ můžete určit moduly, zdrojové soubory a funkce, které okno Zásobník volání považuje za uživatelský kód zadáním v souborech *.natjmc . Toto přizpůsobení platí také pro krokování kódu, pokud používáte nejnovější kompilátor (viz C++ Just My Code).

  • Pokud chcete zadat kód bez uživatele pro všechny uživatele počítače sady Visual Studio, přidejte soubor .natjmc do složky %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers .
  • Pokud chcete zadat jiný než uživatelský kód pro jednotlivého uživatele, přidejte soubor .natjmc do složky %USERPROFILE%\My Documents\Visual Studio version>\<Visualizers.

Soubor .natjmc je soubor XML s touto syntaxí:

<?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>

Atributy elementu modulu

Atribut Popis
Name Požadováno. Úplná cesta modulu nebo modulů. Můžete použít zástupné znaky ? Windows (nula nebo jeden znak) a * (nula nebo více znaků). Příklad:

<Module Name="?:\3rdParty\UtilLibs\*" />

říká ladicímu programu, aby zacházely všechny moduly v \3rdParty\UtilLibs na libovolné jednotce jako s externím kódem.
Company Nepovinné. Název společnosti, která publikuje modul vložený do spustitelného souboru. Tento atribut můžete použít k nejednoznačnosti modulů.

Atributy elementu File

Atribut Popis
Name Požadováno. Úplná cesta ke zdrojovému souboru nebo souborům, které se mají považovat za externí kód. Můžete použít zástupné znaky ? Systému Windows a * při zadávání cesty.

Atributy elementu function

Atribut Popis
Name Požadováno. Plně kvalifikovaný název funkce, který bude považovat za externí kód. Můžete použít zástupné znaky ? Systému Windows a * při zadávání cesty.
Module Nepovinné. Název nebo úplná cesta k modulu, který obsahuje funkci. Tento atribut můžete použít k nejednoznačnosti funkcí se stejným názvem.
ExceptionImplementation Pokud je nastavená hodnota true, zásobník volání zobrazí funkci, která místo této funkce vyvolala výjimku.

Přizpůsobení chování krokování jazyka C++ nezávisle na nastavení jen mého kódu

V projektech C++ můžete určit funkce, které chcete krokovat tak, že je uvedete jako funkce NoStepInto v souborech *.natstepfilter . Funkce uvedené v souborech *.natstepfilter nejsou závislé na nastavení Just My Code. Funkce NoStepInto říká ladicímu programu, aby přes funkci přešla, i když volá některé funkce StepInto nebo jiný uživatelský kód. Na rozdíl od funkcí uvedených v souboru .natjmc ladicí program přejde do prvního řádku uživatelského kódu uvnitř funkce NoStepInto.

  • Pokud chcete zadat kód bez uživatele pro všechny místní uživatele sady Visual Studio, přidejte soubor .natstepfilter do složky %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers .
  • Pokud chcete zadat kód bez uživatele pro jednotlivého uživatele, přidejte soubor .natstepfilter do složky %USERPROFILE%\My Documents\Visual Studio version>\<Visualizers.

Poznámka:

Některá rozšíření třetích stran můžou zakázat funkci filtru .natstepfilter .

Soubor .natstepfilter je soubor XML s touto syntaxí:

<?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 (Prvek) Popis
Function Požadováno. Určuje jednu nebo více funkcí jako neuživatelné funkce.
Name Povinný: Regulární výraz ve formátu ECMA-262 určující úplný název funkce, který se má shodovat. Příklad:

<Name>MyNS::MyClass::.*</Name>

říká ladicímu programu, že všechny metody mají MyNS::MyClass být považovány za neuživatelný kód. Shoda se rozlišují malá a velká písmena.
Module Nepovinné. Regulární výraz ve formátu ECMA-262 určující úplnou cestu k modulu obsahujícímu funkci. Shoda nerozlišuje malá a velká písmena.
Action Povinný: Jedna z těchto hodnot rozlišující malá a velká písmena:

NoStepInto – řekne ladicímu programu, aby přes funkci krokuje.
StepInto – říká ladicímu programu, aby krokoval do funkce, a přepíše všechny ostatní NoStepInto pro shodnou funkci.

Další informace o souborech .natstepfilter a .natjmc

  • Počínaje sadou Visual Studio 2022 verze 17.6 můžete přidat soubory .natjmc a .natstepfilter přímo do řešení nebo projektu.

  • Chyby syntaxe v souborech .natstepfilter a .natjmc nejsou hlášeny v okně Výstup ladicího programu.

  • Na rozdíl od souborů .natvis nejsou soubory .natstepfilter a .natjmc znovu načteny za provozu. Místo toho se tyto soubory znovu načtou na začátku ladicí relace.

  • Pro funkce šablony může být užitečné použití &lt;.*&gt; názvu nebo &lt;.* jeho názvu.

JavaScript Just My Code

JavaScript Just My Code řídí krokování a zobrazení zásobníku volání kategorizací kódu v jedné z těchto klasifikací:

Klasifikace Popis
MyCode Uživatelský kód, který vlastníte a řídíte.
LibraryCode Neuživatelný kód z knihoven, které používáte pravidelně, a vaše aplikace spoléhá na správné fungování (například jQuery).
Nesouvisející kód Kód bez uživatele ve vaší aplikaci, který nevlastníte, a vaše aplikace se nespoléhá na správné fungování. Například reklamní sada SDK, která zobrazuje reklamy, může být nesouvisející s kódem.

Ladicí program JavaScriptu klasifikuje kód jako uživatel nebo jiný uživatel v tomto pořadí:

  1. Výchozí klasifikace.

    • Skript spuštěný předáním řetězce do funkce poskytované eval hostitelem je MyCode.
    • Skript spuštěný předáním řetězce konstruktoru Function je LibraryCode.
    • Skript v referenčních informacích architektury, jako je WinJS nebo Azure SDK, je LibraryCode.
    • Skript spuštěný předáním řetězce do objektu setTimeout, setImmediatenebo setInterval funkcí je NesouvisejícíCode.
  2. Klasifikace v souboru mycode.json aktuálního projektu.

Každý krok klasifikace přepíše předchozí kroky.

Všechny ostatní kódy jsou klasifikovány jako MyCode.

Můžete upravit výchozí klasifikace a klasifikovat konkrétní soubory a adresy URL jako uživatelský nebo jiný než uživatelský kód tak, že do kořenové složky projektu JavaScriptu přidáte .json soubor s názvem mycode.json . Viz Přizpůsobení javascriptového kódu jen pro můj kód.

Během ladění JavaScriptu:

  • Pokud je funkce kód bez uživatele, chová se krok ladění>(nebo F11) stejně jako krok ladění>(nebo F10).
  • Pokud krok začíná v kódu bez uživatele (LibraryCode nebo UnrelatedCode), krokování se dočasně chová, jako by nebyl povolený jenom můj kód. Když se vrátíte zpět k uživatelskému kódu, je krokování jen můj kód znovu povoleno.
  • Když krok uživatelského kódu způsobí opuštění aktuálního kontextu spuštění, ladicí program se zastaví na dalším řádku spuštěného uživatelského kódu. Pokud se například zpětné volání spustí v kódu LibraryCode , ladicí program pokračuje, dokud se nespustí další řádek uživatelského kódu.
  • Krok ven (nebo Shift+F11) se zastaví na dalším řádku uživatelského kódu.

Pokud neexistuje žádný další uživatelský kód, ladění pokračuje až do konce, přejde na jinou zarážku nebo vyvolá chybu.

Zarážky nastavené v kódu jsou vždy nalezeny, ale kód je klasifikovaný.

  • debugger Pokud se klíčové slovo vyskytuje v LibraryCode, ladicí program se vždy přeruší.
  • Pokud se klíčové debugger slovo vyskytuje v nesouvisejícím kódu, ladicí program se nezastaví.

Pokud v kódu MyCode nebo LibraryCode dojde k neošetřené výjimce, ladicí program se vždy přeruší.

Pokud dojde k neošetřené výjimce v nesouvisejícím kódu a MyCode nebo LibraryCode je v zásobníku volání, ladicí program se přeruší.

Pokud jsou pro výjimku povoleny výjimky s první šancí a k výjimce dochází v KnihovněCode nebo nesouvisejícím kódu:

  • Pokud je výjimka zpracována, ladicí program se neruší.
  • Pokud se výjimka nezpracuje, ladicí program se přeruší.

Přizpůsobení JavaScriptu jen pro můj kód

Pokud chcete kategorizovat uživatelský a neuživatelový kód pro jeden javascriptový projekt, můžete do kořenové složky projektu přidat .json soubor s názvem mycode.json .

Soubor mycode.json nemusí vypsat všechny páry klíč-hodnota. Hodnoty MyCode, Knihovny a Nesouvisející můžou být prázdné pole.

Mycode.json soubory používají tuto syntaxi:

{
    "Eval" : "Classification",
    "Function" : "Classification",
    "ScriptBlock" : "Classification",
    "MyCode" : [
        "UrlOrFileSpec",
        . . .
        "UrlOrFileSpec"
    ],
    "Libraries" : [
        "UrlOrFileSpec",
        . .
        "UrlOrFileSpec"
    ],
    "Unrelated" : [
        "UrlOrFileSpec",
        . . .
        "UrlOrFileSpec"
    ]
}

Eval, Function a ScriptBlock

Dvojice hodnot klíče Eval, Function a ScriptBlock určují, jak se dynamicky generovaný kód klasifikuje:

Název Popis
Eval Skript, který se spustí předáním řetězce do funkce poskytované eval hostitelem. Ve výchozím nastavení je skript Eval klasifikován jako MyCode.
Funkce Skript, který se spustí předáním řetězce konstruktoru Function . Ve výchozím nastavení je skript funkce klasifikován jako LibraryCode.
ScriptBlock Skript, který se spustí předáním řetězce do objektu setTimeout, setImmediatenebo setInterval funkcí. Skript ScriptBlock je ve výchozím nastavení klasifikován jako nesouvisející kód.

Hodnotu můžete změnit na jedno z těchto klíčových slov:

  • MyCode klasifikuje skript jako MyCode.
  • Library klasifikuje skript jako LibraryCode.
  • Unrelated klasifikuje skript jako nesouvisející kód.

Moje kódy, knihovny a nesouvisející

Dvojice MyCode, Libraries a Unrelated key value určují adresy URL nebo soubory, které chcete zahrnout do klasifikace:

Název Popis
MyCode Pole adres URL nebo souborů, které jsou klasifikovány jako MyCode.
Knihovny Pole adres URL nebo souborů, které jsou klasifikovány jako LibraryCode.
Nesouvisející Pole adres URL nebo souborů, které jsou klasifikovány jako nesouvisející kód.

Řetězec adresy URL nebo souboru může mít jeden nebo více * znaků, které odpovídají nule nebo více znaků. * je stejná jako regulární výraz .*.