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.
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í
<.*>
názvu nebo<.*
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í:
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
,setImmediate
nebosetInterval
funkcí je NesouvisejícíCode.
- Skript spuštěný předáním řetězce do funkce poskytované
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.
- 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 , setImmediate nebo 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 .*
.