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.
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.
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 .
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].
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:
- DebuggerNonUserCodeAttribute říká ladicímu programu, že kód, na který se používá, není uživatelským kódem.
- DebuggerHiddenAttribute skryje kód z ladicího programu, i když je právě můj kód vypnutý.
- DebuggerStepThroughAttribute říká ladicímu programu, aby krokovat kód, na který se používá, a ne krokovat s kódem.
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.
Aby bylo možné 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ó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ě 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 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í
<.*>
názvu nebo<.*
jeho názvu.
JavaScript Just My Code
V případě projektů .esproj v sadě Visual Studio 2022 používá Visual Studio Code ke konfiguraci a přizpůsobení ladicího programu soubor launch.json . launch.json je konfigurační soubor ladicího programu.
Visual Studio připojí ladicí program pouze k uživatelskému kódu. V projektech .esproj můžete v sadě Visual Studio nakonfigurovat uživatelský kód (tj . nastavení Just My Code ) pomocí skipFiles
nastavení v launch.json. Toto nastavení funguje stejně jako nastavení launch.json v editoru VS Code. Další informace o skipFiles naleznete v tématu Vynechání nezajímavého kódu.