Ladění pouze uživatelského kódu pomocí Just My Code
Just My Code je funkce ladění sady Visual Studio, která automaticky přeskakuje volání systémového, rámcového a dalšího neuživatelského kódu. V okně Zásobník volání funkce Just My Code sbalí 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 v sadě Visual Studio povolit nebo zakázat Pouze Můj Kód, v části Nástroje>Možnosti (nebo Ladění>Možnosti) >Ladění>Obecnévyberte nebo zrušte výběr Povolit Pouze Můj Kód.
Poznámka
Povolit pouze můj kód je globální nastavení, které platí pro všechny projekty sady Visual Studio ve všech jazycích.
Pouze ladění mého kódu
Během ladicí relace okno Moduly ukazuje, které moduly kódu ladicí program považuje za Můj kód (uživatelský kód) a spolu se stavem načítání symbolů. Další informace najdete v části Získejte lepší představu o tom, jak se ladicí program připojuje k vaší aplikaci.
V okně Zásobník volání nebo Úkoly Just My Code sbalí kód, který není uživatelský, do šedého rámečku kódu označeného [External Code]
.
Spropitné
Chcete-li otevřít moduly, zásobník volání, úlohynebo většinu dalších oken pro ladění, musíte být v ladicí relaci. Při ladění v části Ladění>Windowsvyberte okna, která chcete otevřít.
Chcete-li zobrazit kód ve sbaleném [externí kód] rámečku, klikněte pravým tlačítkem na zásobník volání nebo okno úlohy a v místní nabídce vyberte Zobrazit externí kód. Rozbalené externí řádky kódu nahrazují rámec [Externí kód].
cs-CZ:
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ý externí řádek kódu v okně Zásobník volání se zvýrazní řádek volajícího kódu zeleně ve zdrojovém kódu. U knihoven DLL nebo jiných modulů, které nebyly nalezeny nebo načteny, se může otevřít stránka oznamující chybějící symbol nebo zdroj.
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 během ladění.
.NET Just My Code
V .NET projektech používá funkce Just My Code soubory symbolů (.pdb) a optimalizace programu k rozlišení uživatelského a ne-uživatelského kódu. Ladicí program .NET považuje optimalizované binární soubory a nenahrané .pdb soubory za kód, který není uživatelský.
Tři atributy kompilátoru také ovlivňují, co ladicí program .NET považuje za uživatelský kód:
- DebuggerNonUserCodeAttribute říká ladicímu programu, že kód, na který je aplikován, není uživatelským kódem.
- DebuggerHiddenAttribute skryje kód před ladicím programem, i když je vypnutý pouze můj kód.
- DebuggerStepThroughAttribute ladicímu programu říká, že má procházet kód, na který je aplikován, a ne vstupovat do kódu.
Ladicí program .NET považuje všechny ostatní kódy za uživatelský kód.
Během ladění .NET:
- Ladění>Krok dovnitř (nebo F11) při krokování přes neuživatelský kód přeskočí na další řádek uživatelského kódu.
- Ladění>Krok ven (nebo Shift+F11) na dalším řádku uživatelského kódu.
Pokud není žádný další uživatelský kód, ladění pokračuje, dokud neskončí, nenarazí na zarážku, nebo nevyvolá chybu.
Pokud ladicí program přeruší kód bez uživatele (například použijete Debug>Break All and pause in non-user code), zobrazí se okno Bez zdrojového. Potom můžete pomocí příkazu Ladit>Krok 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í rámeček označený poznámkou [Externí kód].
C++ Just My Code
Počínaje sadou Visual Studio 2017 verze 15.8 se podporuje také krokování kódu pomocí funkce "Just My Code". Tato funkce také vyžaduje použití přepínače kompilátoru /JMC (pouze ladění mého kódu). Přepínač je ve výchozím nastavení povolen v projektech C++. Pro okno zásobníku volání a podporu zásobníku volání v Just My Code není vyžadován přepínač /JMC.
Chcete-li 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 (pomocí okna Moduly zkontrolujte stav načítání).
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ódu bez uživatele:
- Funkce s odstraněnými 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 specifikované v souborech *.natjmc v 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ódu bez uživatele:
- Funkce, pro které nebyl do ladicího programu načten odpovídající soubor PDB.
- Funkce určené v souborech *.natjmc v adresáři %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 tento blogový příspěvek. Pro kód zkompilovaný pomocí staršího kompilátoru .natstepfilter soubory jsou 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í v C++.
Během ladění jazyka C++ se ve výchozím nastavení přeskočí jiný než uživatelský kód. Během ladění jazyka C++:
- ladění>krok do (nebo F11) u kroků kódu bez uživatele nebo se spustí na další řádek uživatelského kódu, pokud krok do je volána z kódu bez uživatele.
- Ladění>Krok ven (nebo Shift+F11) přeskočí na další řádek uživatelského kódu (mimo aktuální zásobník).
Pokud neexistuje žádný další kód od uživatele, ladění pokračuje, dokud neskončí, nenarazí na jinou zarážku nebo nevyvolá chybu.
Pokud se ladicí program přeruší v neuživatelském kódu (například použijete Debug>Break All a pozastavíte se v neuživatelském kódu), bude krokování pokračovat v neuživatelském kódu.
Pokud ladicí program narazí na výjimku, zastaví se na ní, ať už je v uživatelském nebo systémovém kódu. Uživatelsky neošetřené možnosti v dialogovém okně Nastavení výjimek se ignorují.
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 neuživatelský kód zadáním ve formátu *.natjmc soubory. 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 určit kód, který není uživatelský, pro konkrétního uživatele, přidejte soubor .natjmc do složky %USERPROFILE%\Dokumenty\<Visual Studio verze>\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 |
Povinné. Úplná cesta modulu nebo modulů. Můžete použít zástupné znaky systému Windows ? (nula nebo jeden znak) a * (nula nebo více znaků). Například<Module Name="?:\3rdParty\UtilLibs\*" /> říká ladicímu programu, aby všechny moduly v \3rdParty\UtilLibs na libovolné jednotce považoval za externí kód. |
Company |
Volitelný. Název společnosti, která publikuje modul vložený do spustitelného souboru. Tento atribut můžete použít k rozlišení modulů. |
Atributy souborového elementu
Atribut | Popis |
---|---|
Name |
Povinné. Úplná cesta ke zdrojovému souboru nebo souborům, které se mají považovat za externí kód. Při zadávání cesty můžete použít zástupné znaky systému Windows ? a * . |
atributy elementu funkce
Atribut | Popis |
---|---|
Name |
Povinné Plně kvalifikovaný název funkce, který bude považovat za externí kód. Při zadávání cesty můžete použít zástupné znaky systému Windows ? a * . |
Module |
Volitelný. 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 nastavena hodnota na true , zásobník volání zobrazí funkci, která vyvolala výjimku, místo této funkce. |
Přizpůsobte chování krokování v jazyce C++ nezávisle na nastavení pouze mého kódu.
V projektech C++ můžete určit funkce, které chcete přeskočit při krokování, tím, že je uvedete jako funkce NoStepInto v souborech *.natstepfilter. Funkce uvedené v *.natstepfilter souborech 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í zmíněných v .natjmcladicí program přejde na první řádek uživatelského kódu uvnitř funkce "NoStepInto".
- Pokud chcete zadat jiný než uživatelský kód 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 jiný než uživatelský kód pro jednotlivého uživatele, přidejte soubor .natstepfilter do složky %USERPROFILE%\Dokumenty\<verze sady Visual Studio>\Visualizers.
Poznámka
Některá rozšíření třetích stran můžou zakázat funkci .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>
Prvek | Popis |
---|---|
Function |
Povinné. 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. Například:<Name>MyNS::MyClass::.*</Name> říká ladicímu programu, že všechny metody v MyNS::MyClass jsou považovány za neúživatelský kód. Shoda rozlišuje malá a velká písmena. |
Module |
Volitelný. 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 – přikazuje ladicímu programu, aby přes funkci přejít.StepInto – říká ladicímu programu, aby vstoupil do funkce a přebil všechny ostatní NoStepInto pro odpovídající 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ýstupu ladicího programu.
Na rozdíl od souborů .natvis.natstepfilter a .natjmc soubory nejsou znovu načteny za provozu. Místo toho se tyto soubory znovu načtou blízko začátku ladicí relace.
U funkcí šablon může být užitečné použití
<.*>
nebo<.*
v názvu.
JavaScript Pouze Můj Kód
Pro projekty .esproj v sadě Visual Studio 2022 používá Visual Studio Code soubor launch.json ke konfiguraci a přizpůsobení ladicího programu. launch.json je konfigurační soubor ladicího programu.
Visual Studio připojí ladicí program pouze k uživatelskému kódu. Pro projekty .esproj můžete v sadě Visual Studio nakonfigurovat uživatelský kód (tj. nastavení Just My Code) pomocí nastavení skipFiles
v launch.json. Toto nastavení funguje stejně jako nastavení launch.json v editoru VS Code. Více informací o skipFilesnaleznete v části Přeskočení nezajímavého kódu.