Ladění pouze uživatelského kódu s Pouze můj kód

Pouze můj kód je funkce Visual Studio, která automaticky postupuje přes volání do systému, architektury a jiného kódu bez uživatele. V okně Zásobník volání tato Pouze můj kód volání do snímků [externího kódu].

Pouze můj kód v projektech .NET, C++ a JavaScript funguje jinak.

Povolení nebo zakázání Pouze můj kód

Ve většině programovacích jazyků Pouze můj kód ve výchozím nastavení povoleno.

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

Povolení Pouze můj kód v dialogovém okně Možnosti

Poznámka

Enable Pouze můj kód je globální nastavení, které platí pro všechny Visual Studio projekty ve všech jazycích.

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

Během ladicí relace se v okně Moduly zobrazí moduly kódu, se kterým ladicí program zachází jako s mým kódem (uživatelským kódem) a se stavem načítání symbolů. Další informace najdete v tématu Seznámení s tím, jak se ladicí program připojuje k vaší aplikaci.

Uživatelský kód v okně Moduly

V okně Zásobník volání nebo Úlohy Pouze můj kód kód uživatele sbalí do zašedlého anotovaného rámce kódu s popiskem [External Code] .

Rámec externího kódu 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. Během ladění v části > Windows vyberte okna, která chcete otevřít.

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

Zobrazení externího kódu v okně Zásobník volání

Poznámka

Show External Code je aktuální nastavení profileru uživatele, které platí pro všechny projekty ve všech jazycích otevřených uživatelem.

Poklikáním na rozbalený řádek externího kódu v okně Zásobník volání se řádek volajícího kódu zvýrazní zeleně ve zdrojovém kódu. U knihoven DLL nebo jiných modulů, které se nenašly nebo nenačetly, se může otevřít stránka symbolu nebo zdroje, který nebyl nalezen.

.NET Pouze můj kód

V projektech .NET Pouze můj kód ke klasifikaci uživatelského i ne user kódu soubory symbolů (.pdb) a optimalizace programu. Ladicí program .NET považuje optimalizované binární soubory a nezatížené soubory .pdb za kód, který není uživatelem.

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

Ladicí program .NET považuje veškerý ostatní kód za uživatelský kód.

Během ladění .NET:

  • Ladění > Krok Do (nebo F11) u kódu bez uživatele postupuje kód na další řádek uživatelského kódu.
  • Ladění > Krok Ven (nebo Shift + F11) u kódu, který není uživatelem, 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, narazí na jinou zarážku nebo vyvolá chybu.

Pokud se ladicí program přeruší v kódu 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 Žádný zdroj. 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 kódu bez uživatele, ladicí program se přeruší na řádku uživatelského kódu, kde byla výjimka vygenerována.

Pokud jsou pro výjimku povoleny výjimky první náhody, je řádek volajícího uživatelského kódu zvýrazněn zeleně ve zdrojovém kódu. V okně Zásobník volání se zobrazí anotovaný rámec s popiskem [Externí kód].

C++ – Pouze můj kód

Od verze Visual Studio 2017 verze 15.8 se podporuje Pouze můj kód krokování kódu. Tato funkce také vyžaduje použití přepínače kompilátoru /JMC (pouze ladění kódu). Přepínač je v projektech C++ standardně povolený. Pro okno Zásobník volání a podporu zásobníku volání v Pouze můj kód se přepínač /JMC nevyžaduje.

Aby bylo možné ho klasifikovat jako uživatelský kód, musí být soubor PDB pro binární soubor obsahující uživatelský kód načten ladicím programem (zkontrolujte to v okně Moduly).

Pro chování zásobníku volání, například v okně Zásobník volání, Pouze můj kód v jazyce C++ považuje pouze tyto funkce za kód, který není uživatelem:

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

Pro chování krokování kódu Pouze můj kód v jazyce C++ považuje pouze tyto funkce za kód, který není uživatelem:

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

Poznámka

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

Během ladění C++:

  • Ladění > Krok Do (nebo F11) u kódu bez uživatele postupuje kód na další řádek uživatelského kódu.
  • Ladění > Krok Ven (nebo Shift + F11) u kódu, který není uživatelem, 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, narazí na jinou zarážku nebo vyvolá chybu.

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

Pokud ladicí program narazí na výjimku, zastaví se u výjimky bez ohledu na to, jestli je v uživatelském nebo jiném uživatelském kódu. Možnosti neošetřené uživatelem v dialogovém Nastavení výjimky jsou ignorovány.

Přizpůsobení zásobníku volání jazyka 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 kód uživatele, a to jejich 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++ Pouze můj kód).

  • Pokud chcete zadat kód uživatele pro všechny uživatele počítače Visual Studio, přidejte soubor .natjmc do složky %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
  • Pokud chcete pro jednotlivé uživatele zadat kód uživatele, přidejte soubor .natjmc do složky %USERPROFILE%\Dokumenty \<Visual Studio > \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á hodnota. Úplná cesta modulu nebo modulů. Můžete použít následující Windows zástupné znaky (nula nebo jeden znak) a ? * (nula nebo více znaků). Třeba

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

říká ladicímu programu, aby všechny moduly ve složce \3rdParty\UtilLibs na libovolné jednotce považoval za externí kód.
Company Nepovinný parametr. Název společnosti, která publikuje modul vložený do spustitelného souboru. Tento atribut můžete použít k rozjednoznačnosti modulů.

Atributy elementu souboru

Atribut Popis
Name Povinná hodnota. Úplná cesta ke zdrojovému souboru nebo souborům, které se zachází jako s externím kódem. Při zadávání cesty Windows použít zástupné znaky ? * a .

Atributy elementu funkce

Atribut Popis
Name Povinná hodnota. Plně kvalifikovaný název funkce, která se má považovat za externí kód.
Module Nepovinný parametr. Název nebo úplná cesta k modulu, který obsahuje funkci. Tento atribut lze použít k jednoznačné funkci se stejným názvem.
ExceptionImplementation Při nastavení true na hodnotu zobrazí zásobník volání funkci, která vyvolala výjimku místo této funkce.

Přizpůsobení chování krokování v jazyce C++ nezávisle na Pouze můj kód nastavení

V projektech v jazyce C++ můžete zadat funkce pro krokování jejich uvedením jako neuživatelský kód v souborech * . natstepfilter . Funkce uvedené v souborech * . natstepfilter nejsou závislé na nastavení pouze můj kód.

  • chcete-li zadat jiný než uživatelský kód pro všechny místní Visual Studio uživatele, přidejte soubor . natstepfilter do složky %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers .
  • chcete-li určit neuživatelský kód pro jednotlivé uživatele, přidejte soubor . natstepfilter do dokumentů%USERPROFILE%\My<složce \ Visual Studio verze > \Visualizers .

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 Popis
Function Povinná hodnota. Určuje jednu nebo více funkcí jako neuživatelské funkce.
Name Povinná hodnota. Formátovaný regulární výraz ECMA-262 určující úplný název funkce, který se má shodovat. Například:

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

oznamuje ladicímu programu, že všechny metody v MyNS::MyClass mají být považovány za neuživatelský kód. Porovnávání rozlišuje velká a malá písmena.
Module Nepovinný parametr. Formátovaný regulární výraz ECMA-262 určující úplnou cestu k modulu, který obsahuje funkci. U porovnávání se nerozlišují malá a velká písmena.
Action Povinná hodnota. Jedna z těchto hodnot citlivých na velká a malá písmena:

NoStepInto – instruuje ladicí program, aby převzal funkci.
StepInto – instruuje ladicí program, aby se přepsal do funkce a přepsaly se jiné NoStepInto pro odpovídající funkci.

Pouze můj kód JavaScriptu

JavaScript Pouze můj kód řídí krokování a zobrazování zásobníku volání pomocí kategorizace kódu v jedné z těchto klasifikací:

Klasifikace Popis
MyCode Uživatelský kód, který vlastníte a ovládáte.
LibraryCode Neuživatelský kód z knihoven, které často používáte, a vaše aplikace spoléhá na správné fungování (například WinJS nebo jQuery).
UnrelatedCode Neuživatelský kód v aplikaci, který nevlastníte, a vaše aplikace nespoléhá na správné fungování. Například reklamní sada SDK, která zobrazuje reklamy, by mohla být UnrelatedCode. V projektech UWP se jako UnrelatedCode považuje také jakýkoli kód, který je načten do vaší aplikace z identifikátoru URI protokolu HTTP nebo HTTPS.

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

  1. Výchozí klasifikace.

    • Skript spuštěný předáním řetězce do funkce poskytnuté hostitelem eval je myCode.
    • Skript spuštěný předáním řetězce do Function konstruktoru je LibraryCode.
    • Skript v odkazu na rozhraní, jako je WinJS nebo Azure SDK, je LibraryCode.
    • Skript spuštěný předáním řetězce do setTimeout , setImmediate nebo setInterval funkce je UnrelatedCode.
  2. klasifikace zadané pro všechny Visual Studio projektů javascriptu v souboru % VSInstallDirectory% \JavaScript\JustMyCode\mycode.default.wwa.jsv souboru.

  3. Klasifikace v mycode.jsv souboru 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živatel nebo neuživatelský kód přidáním souboru . JSON s názvem mycode.js do kořenové složky projektu JavaScriptu. Viz přizpůsobení pouze můj kód JavaScriptu.

Během ladění JavaScriptu:

  • Pokud je funkce neuživatelský kód, krok ladění > (nebo klávesa F11) se chová stejně jako krok ladění > (nebo F10).
  • Pokud krok začíná v kódu, který není uživatel (LibraryCode nebo UnrelatedCode), krok se dočasně chová, jako by pouze můj kód není povolená. Až se vrátíte k uživatelskému kódu, Pouze můj kód krokování se znovu povolí.
  • Když krok uživatelského kódu vede k ukončení aktuálního kontextu spuštění, ladicí program se zastaví na následujícím řádku kódu spouštěného uživatelem. Například pokud se zpětné volání provede 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 není k dispozici více uživatelských kódů, ladění pokračuje, dokud nebude ukončeno, narazí na jinou zarážku nebo vyvolá chybu.

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

  • Pokud se debugger klíčové slovo vyskytuje v LibraryCode, ladicí program se vždy přeruší.
  • Pokud se debugger klíčové slovo vyskytuje v UnrelatedCode, ladicí program se nezastaví.

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

Pokud v UnrelatedCode dojde k neošetřené výjimce a v zásobníku volání je myCode nebo LibraryCode , ladicí program se přeruší.

Pokud jsou pro výjimku povoleny výjimky s první pravděpodobností a k výjimce dojde v LibraryCode nebo UnrelatedCode:

  • Pokud je výjimka zpracována, ladicí program nebude přerušen.
  • Pokud výjimka není zpracována, ladicí program se přeruší.

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

Pro kategorizaci uživatelského a neuživatelského kódu pro jeden projekt JavaScriptu můžete přidat soubor . JSON s názvem mycode.js do kořenové složky projektu.

Specifikace v tomto souboru přepisují výchozí klasifikace a mycode.default.wwa.jsv souboru. mycode.jsv souboru nemusí vypisovat všechny páry klíč-hodnota. MyCode, knihovny a nesouvisející hodnoty mohou být prázdná pole.

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

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

Eval, Function a ScriptBlock

Páry hodnot klíčů Eval, Function a ScriptBlock určují způsob klasifikace dynamicky generovaného kódu:

Název Popis
Eval Skript, který je spuštěn předáním řetězce do funkce poskytnuté hostitelem eval . Ve výchozím nastavení je skript Eval klasifikován jako myCode.
Funkce Skript, který je spuštěn předáním řetězce Function konstruktoru. Ve výchozím nastavení je skript funkcí klasifikován jako LibraryCode.
ScriptBlock Skript, který je spuštěn předáním řetězce do setTimeout funkce, setImmediate nebo setInterval . Ve výchozím nastavení je skript ScriptBlock klasifikován jako UnrelatedCode.

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

  • MyCode klasifikuje skript jako myCode.
  • Library klasifikuje skript jako LibraryCode.
  • Unrelated klasifikuje skript jako UnrelatedCode.

MyCode, knihovny a nesouvisející

Páry klíč-hodnota myCode, knihovny a nesouvisející hodnoty klíčů 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 UnrelatedCode.

Adresa URL nebo řetězec souboru může obsahovat jeden nebo více * znaků, které se shodují s žádným nebo více znaky. * je stejný jako regulární výraz .* .