Debugowanie tylko kodu użytkownika przy użyciu tylko mojego kodu

Just My Code to funkcja debugowania programu Visual Studio, która automatycznie wykonuje kroki w wywołaniach systemu, struktury i innego kodu innego niż użytkownik. W oknie Stos wywołań po prostu mój kod zwija te wywołania do ramek [Kod zewnętrzny].

Tylko mój kod działa inaczej w projektach .NET i C++.

Włączanie lub wyłączanie tylko mojego kodu

W przypadku większości języków programowania tylko mój kod jest domyślnie włączony.

  • Aby włączyć lub wyłączyć tylko mój kod w programie Visual Studio, w obszarze Opcje narzędzi>(lub Opcje debugowania>) >Debugowanie>ogólne, wybierz lub usuń zaznaczenie pozycji Włącz tylko mój kod.

Screenshot of Enable Just My Code in the Options dialog box.

Screenshot of Enable Just My Code in the Options dialog box.

Uwaga

Włącz tylko mój kod to ustawienie globalne, które ma zastosowanie do wszystkich projektów programu Visual Studio we wszystkich językach.

Tylko mój kod, debugowanie

Podczas sesji debugowania okno Moduły pokazuje, które moduły kodu debuger traktuje jako Mój kod (kod użytkownika) wraz ze stanem ładowania symboli. Aby uzyskać więcej informacji, zobacz Get more familiar with how the debugger attaches to your app (Dowiedz się więcej o tym, jak debuger dołącza do aplikacji).

Screenshot of user code in the Modules window.

Screenshot of user code in the Modules window.

W oknie Stos wywołań lub Zadania Po prostu Mój kod zwija kod inny niż użytkownik do szarej ramki kodu z adnotacjami z [External Code]etykietą .

Screenshot of External Code in the Call Stack window.

Screenshot of External Code in the Call Stack window.

Napiwek

Aby otworzyć moduły, stos wywołań, zadania lub większość innych okien debugowania, musisz być w sesji debugowania. Podczas debugowania w obszarze Debugowanie>systemu Windows wybierz okna, które chcesz otworzyć.

Aby wyświetlić kod w zwiniętej ramce [Kod zewnętrzny], kliknij prawym przyciskiem myszy w oknie Stos wywołań lub Zadanie , a następnie wybierz polecenie Pokaż kod zewnętrzny z menu kontekstowego. Rozwinięte wiersze kodu zewnętrznego zastępują ramkę [Kod zewnętrzny].

Screenshot of Show External Code in the Call Stack window.

Screenshot of Show External Code in the Call Stack window.

Uwaga

Pokaż kod zewnętrzny to bieżące ustawienie profilera użytkownika, które ma zastosowanie do wszystkich projektów we wszystkich językach otwieranych przez użytkownika.

Dwukrotne kliknięcie rozwiniętego wiersza kodu zewnętrznego w oknie stosu wywołań wyróżnia wiersz kodu wywołującego w kolorze zielonym w kodzie źródłowym. W przypadku bibliotek DLL lub innych modułów, które nie zostały odnalezione lub załadowane, może zostać otwarta strona symbolu lub źródła.

Począwszy od programu Visual Studio 2022 w wersji 17.7, możesz automatycznie skompilować kod .NET, klikając dwukrotnie kod zewnętrzny w oknie Stos wywołań. Aby uzyskać więcej informacji, zobacz Generowanie kodu źródłowego na podstawie zestawów platformy .NET podczas debugowania.

.NET Just My Code

W projektach .NET tylko mój kod używa plików symboli (pdb) i optymalizacji programów do klasyfikowania kodu użytkownika i użytkownika innego niż użytkownik. Debuger platformy .NET uwzględnia zoptymalizowane pliki binarne i pliki pdb, które nie są ładowane jako kod inny niż użytkownik.

Trzy atrybuty kompilatora mają również wpływ na to, co debuger platformy .NET uważa za kod użytkownika:

Debuger platformy .NET uwzględnia cały inny kod jako kod użytkownika.

Podczas debugowania platformy .NET:

  • Debugowanie>kroku do (lub F11) w krokach kodu innego niż użytkownik w kodzie do następnego wiersza kodu użytkownika.
  • Debugowanie>wyjścia (lub Shift+F11) w kodzie innym niż użytkownik jest uruchamiane do następnego wiersza kodu użytkownika.

Jeśli nie ma więcej kodu użytkownika, debugowanie będzie kontynuowane do momentu zakończenia, trafi do innego punktu przerwania lub zgłosi błąd.

Jeśli debuger przerywa działanie kodu innego niż użytkownik (na przykład użyj polecenia Debug Break>All i wstrzymaj w kodzie nieuchwytnym), zostanie wyświetlone okno Brak źródła . Następnie możesz użyć polecenia Krok debugowania>, aby przejść do następnego wiersza kodu użytkownika.

Jeśli nieobsługiwany wyjątek występuje w kodzie użytkownika, debuger przerywa działanie w wierszu kodu użytkownika, w którym został wygenerowany wyjątek.

Jeśli wyjątki z pierwszą szansą są włączone dla wyjątku, wywołanie wiersza kodu użytkownika jest wyróżnione na zielono w kodzie źródłowym. W oknie Stos wywołań zostanie wyświetlona ramka z adnotacjami oznaczona etykietą [Kod zewnętrzny].

C++ Tylko mój kod

Począwszy od programu Visual Studio 2017 w wersji 15.8, obsługiwany jest również krok po prostu mój kod. Ta funkcja wymaga również użycia przełącznika kompilatora /JMC (tylko debugowanie kodu). Przełącznik jest domyślnie włączony w projektach C++. W przypadku okna stosu wywołań i obsługi stosu wywołań w programie Just My Code przełącznik /JMC nie jest wymagany.

Aby klasyfikować jako kod użytkownika, plik PDB pliku binarnego zawierającego kod użytkownika musi zostać załadowany przez debuger (użyj okna Moduły , aby to sprawdzić).

W przypadku zachowania stosu wywołań, takiego jak w oknie stosu wywołań, pozycja Just My Code w języku C++ uwzględnia tylko te funkcje jako kod nieuchwytny użytkownika:

  • Funkcje z pozbawionymi informacjami źródłowymi w pliku symboli.
  • Funkcje, w których pliki symboli wskazują, że nie ma pliku źródłowego odpowiadającego ramce stosu.
  • Funkcje określone w plikach *.natjmc w folderze %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers .

W przypadku zachowania krokowego kodu tylko mój kod w języku C++ uwzględnia tylko te funkcje jako kod inny niż użytkownik:

  • Funkcje, dla których odpowiedni plik PDB nie został załadowany w debugerze.
  • Funkcje określone w plikach *.natjmc w folderze %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers .

Uwaga

Aby zapewnić obsługę kroków kodu w programie Just My Code, należy skompilować kod C++ przy użyciu kompilatorów MSVC w programie Visual Studio 15.8 (wersja zapoznawcza 3 lub nowsza), a przełącznik kompilatora /JMC musi być włączony (domyślnie jest włączony). Aby uzyskać dodatkowe informacje, zobacz Dostosowywanie stosu wywołań języka C++ i zachowania kroków kodu oraz tego wpisu w blogu. W przypadku kodu skompilowanego przy użyciu starszego kompilatora pliki natstepfilter są jedynym sposobem dostosowywania kroków kodu, który jest niezależny od tylko mojego kodu. Zobacz Dostosowywanie zachowania krokowego języka C++.

Podczas debugowania języka C++ kod inny niż użytkownik jest domyślnie pomijany. Podczas debugowania języka C++:

  • Debugowanie>kroku do (lub F11) w krokach kodu innego niż użytkownik lub jest uruchamiane do następnego wiersza kodu użytkownika, jeśli krok do jest wywoływany z kodu innego niż użytkownik.
  • Debugowanie>wyjścia (lub Shift+F11) w kodzie innym niż użytkownik jest uruchamiane do następnego wiersza kodu użytkownika (poza bieżącą ramką stosu).

Jeśli nie ma więcej kodu użytkownika, debugowanie będzie kontynuowane do momentu zakończenia, trafi do innego punktu przerwania lub zgłosi błąd.

Jeśli debuger przerywa działanie kodu innego niż użytkownik (na przykład użyj polecenia Debug Break>All i wstrzymaj kod inny niż użytkownik), krok będzie kontynuowany w kodzie niebędącym użytkownikiem.

Jeśli debuger osiągnie wyjątek, zatrzymuje się w wyjątku, niezależnie od tego, czy jest on w kodzie użytkownika, czy nieuprzyjętego użytkownika. Opcje nieobsługiwane przez użytkownika w oknie dialogowym Wyjątki Ustawienia są ignorowane.

Dostosowywanie stosu wywołań języka C++ i zachowania krokowego kodu

W przypadku projektów języka C++ można określić moduły, pliki źródłowe i funkcje , które okno stosu wywołań traktuje jako kod inny niż użytkownik, określając je w plikach *.natjmc . To dostosowanie dotyczy również kroku kodu, jeśli używasz najnowszego kompilatora (zobacz C++ Just My Code).

  • Aby określić kod inny niż użytkownik dla wszystkich użytkowników maszyny programu Visual Studio, dodaj plik natjmc do folderu %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers .
  • Aby określić kod inny niż użytkownik dla pojedynczego użytkownika, dodaj plik natjmc do folderu %USERPROFILE%\My Documents\Visual Studio version>\<Visualizers.

Plik natjmc jest plikiem XML o następującej składni:

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

Atrybuty elementu modułu

Atrybut opis
Name Wymagane. Pełna ścieżka modułu lub modułów. Można użyć symboli ? wieloznacznych systemu Windows (zero lub jeden znak) i * (zero lub więcej znaków). Przykład:

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

polecenie debugera, aby traktować wszystkie moduły w \3rdParty\UtilLibs na dowolnym dysku jako kod zewnętrzny.
Company Opcjonalny. Nazwa firmy publikujące moduł osadzony w pliku wykonywalny. Tego atrybutu można użyć do uściślania modułów.

Atrybuty elementu pliku

Atrybut opis
Name Wymagane. Pełna ścieżka pliku źródłowego lub plików do traktowania jako kodu zewnętrznego. Możesz użyć symboli ? wieloznacznych systemu Windows i * podczas określania ścieżki.

Atrybuty elementu funkcji

Atrybut opis
Name Wymagane. W pełni kwalifikowana nazwa funkcji do traktowania jako kodu zewnętrznego. ou może używać symboli ? wieloznacznych systemu Windows i * podczas określania ścieżki.
Module Opcjonalny. Nazwa lub pełna ścieżka do modułu, który zawiera funkcję. Tego atrybutu można użyć do uściślania funkcji o tej samej nazwie.
ExceptionImplementation W przypadku ustawienia na truewartość stos wywołań wyświetla funkcję, która rzuciła wyjątek, a nie tę funkcję.

Dostosowywanie zachowania krokowego języka C++ niezależnie od ustawień tylko mojego kodu

W projektach języka C++ można określić funkcje, które należy wykonać, wyświetlając je jako funkcje NoStepInto w plikach *.natstepfilter . Funkcje wymienione w plikach *.natstepfilter nie są zależne od ustawień Tylko mój kod. Funkcja NoStepInto nakazuje debugerowi przejście przez funkcję, nawet jeśli wywołuje niektóre funkcje StepInto lub inny kod użytkownika. W przeciwieństwie do funkcji wymienionych w pliku natjmc debuger przejdzie do pierwszego wiersza kodu użytkownika wewnątrz funkcji NoStepInto.

  • Aby określić kod inny niż użytkownik dla wszystkich lokalnych użytkowników programu Visual Studio, dodaj plik natstepfilter do folderu %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers .
  • Aby określić kod użytkownika innego niż użytkownik, dodaj plik natstepfilter do folderu %USERPROFILE%\My Documents\Visual Studio version>\<Visualizers.

Uwaga

Niektóre rozszerzenia innych firm mogą wyłączyć funkcję natstepfilter .

Plik natstepfilter jest plikiem XML o tej składni:

<?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 opis
Function Wymagane. Określa co najmniej jedną funkcję jako funkcje inne niż użytkownik.
Name Wymagany. Wyrażenie regularne w formacie ECMA-262 określające pełną nazwę funkcji, która ma być zgodna. Na przykład:

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

informuje debuger, że wszystkie metody w MyNS::MyClass programie mają być traktowane jako kod niebędący użytkownikiem. Dopasowanie jest uwzględniane w wielkości liter.
Module Opcjonalny. Wyrażenie regularne w formacie ECMA-262 określające pełną ścieżkę do modułu zawierającego funkcję. Dopasowanie jest bez uwzględniania wielkości liter.
Action Wymagany. Jedna z tych wartości z uwzględnieniem wielkości liter:

NoStepInto — nakazuje debugerowi przejście przez funkcję.
StepInto — nakazuje debugerowi przejście do funkcji, przesłaniając wszystkie inne NoStepInto dla dopasowanej funkcji.

Dodatkowe informacje na temat plików natstepfilter i natjmc

  • Począwszy od programu Visual Studio 2022 w wersji 17.6, można dodać pliki natjms i natstepfilter bezpośrednio do rozwiązania lub projektu.

  • Błędy składni w plikach natstepfilter i natjmc nie są zgłaszane w oknie dane wyjściowe debugera.

  • W przeciwieństwie do plików natvis pliki natstepfilter i natjmc nie są ładowane ponownie. Zamiast tego te pliki są ponownie ładowane na początku sesji debugowania.

  • W przypadku funkcji szablonu &lt;.*&gt; użycie nazwy lub &lt;.* w nazwie może być przydatne.

JavaScript Just My Code

JavaScript Just My Code steruje krokami i wyświetlaniem stosu wywołań przez kategoryzowanie kodu w jednej z następujących klasyfikacji:

Klasyfikacja opis
MyCode Kod użytkownika, którego jesteś właścicielem i kontrolujesz.
Kod biblioteki Kod nieużytkownika z bibliotek, których używasz regularnie, a aplikacja korzysta z poprawnego działania (na przykład jQuery).
Niepowiązany kod Kod inny niż użytkownik w aplikacji, którego nie jesteś właścicielem, a aplikacja nie korzysta z poprawnego działania. Na przykład zestaw SDK reklamy, który wyświetla reklamy, może mieć wartość Niepowiązany kod.

Debuger języka JavaScript klasyfikuje kod jako użytkownik lub inny niż użytkownik w następującej kolejności:

  1. Domyślne klasyfikacje.

    • Skrypt wykonywany przez przekazanie ciągu do funkcji udostępnionej eval przez hosta to MyCode.
    • Skrypt wykonywany przez przekazanie ciągu do konstruktora Function to LibraryCode.
    • Skrypt w dokumentacji platformy, takiej jak WinJS lub Azure SDK, to LibraryCode.
    • Skrypt wykonywany przez przekazanie ciągu do setTimeoutfunkcji , setImmediatelub setInterval ma wartość Niepowiązany kod.
  2. Klasyfikacje w pliku mycode.json bieżącego projektu.

Każdy krok klasyfikacji zastępuje poprzednie kroki.

Cały inny kod jest klasyfikowany jako MyCode.

Możesz zmodyfikować domyślne klasyfikacje i sklasyfikować określone pliki i adresy URL jako kod użytkownika lub innego użytkownika, dodając plik .json o nazwie mycode.json do folderu głównego projektu JavaScript. Zobacz Dostosowywanie kodu JavaScript Tylko mój kod.

Podczas debugowania języka JavaScript:

  • Jeśli funkcja jest kodem innym niż użytkownik, debugowanie>kroku (lub F11) działa tak samo jak krok debugowania>(lub F10).
  • Jeśli krok rozpoczyna się w kodzie innym niż użytkownik (LibraryCode lub Niepowiązany kod), wykonywanie kroków tymczasowo zachowuje się tak, jakby pozycja Just My Code nie została włączona. Po powrocie do kodu użytkownika krok po kroku Just My Code zostanie ponownie włączony.
  • Gdy krok kodu użytkownika powoduje pozostawienie bieżącego kontekstu wykonywania, debuger zatrzymuje się w następnym wykonanym wierszu kodu użytkownika. Jeśli na przykład wywołanie zwrotne jest wykonywane w kodzie LibraryCode , debuger będzie kontynuowany do następnego wiersza kodu użytkownika.
  • Krok wychodzący (lub Shift+F11) zatrzymuje się w następnym wierszu kodu użytkownika.

Jeśli nie ma więcej kodu użytkownika, debugowanie będzie kontynuowane do momentu zakończenia, trafi do innego punktu przerwania lub zgłosi błąd.

Punkty przerwania ustawione w kodzie są zawsze osiągane, ale kod jest klasyfikowany.

  • debugger Jeśli słowo kluczowe występuje w bibliotece LibraryCode, debuger zawsze przerywa działanie.
  • debugger Jeśli słowo kluczowe występuje w niepowiązanym kodzie, debuger nie zostanie zatrzymany.

Jeśli w kodzie MyCode lub LibraryCode wystąpi nieobsługiwany wyjątek, debuger zawsze przerywa działanie.

Jeśli nieobsługiwany wyjątek występuje w niepowiązanym kodzie, a kod MyCode lub LibraryCode znajduje się na stosie wywołań, debuger przerywa działanie.

Jeśli wyjątki z pierwszą szansą są włączone dla wyjątku, a wyjątek występuje w biblioteceCode lub Niepowiązanym kodzie:

  • Jeśli wyjątek zostanie obsłużony, debuger nie zostanie przerwany.
  • Jeśli wyjątek nie jest obsługiwany, debuger przerywa działanie.

Dostosowywanie kodu JavaScript Just My Code

Aby kategoryzować kod użytkownika i nieużytkownika dla pojedynczego projektu JavaScript, możesz dodać plik .json o nazwie mycode.json do folderu głównego projektu.

Plik mycode.json nie musi zawierać listy wszystkich par klucz-wartość. Wartości MyCode, Libraries i Niepowiązane mogą być puste.

Mycode.json pliki używają tej składni:

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

Eval, Function i ScriptBlock

Pary wartości klucza Eval, Function i ScriptBlock określają, jak dynamicznie generowany kod jest klasyfikowany:

Nazwa/nazwisko opis
Eval Skrypt wykonywany przez przekazanie ciągu do funkcji dostarczonej eval przez hosta. Domyślnie skrypt Eval jest klasyfikowany jako MyCode.
Funkcja Skrypt wykonywany przez przekazanie ciągu do konstruktora Function . Domyślnie skrypt funkcji jest klasyfikowany jako LibraryCode.
ScriptBlock Skrypt wykonywany przez przekazanie ciągu do setTimeoutfunkcji , setImmediatelub setInterval . Domyślnie skrypt ScriptBlock jest klasyfikowany jako Niepowiązany kod.

Możesz zmienić wartość na jedno z następujących słów kluczowych:

  • MyCode Klasyfikuje skrypt jako MyCode.
  • Library Klasyfikuje skrypt jako LibraryCode.
  • Unrelated klasyfikuje skrypt jako Niepowiązany kod.

MyCode, biblioteki i niepowiązane

Pary Wartości klucza MyCode, Biblioteki i Niepowiązane określają adresy URL lub pliki, które mają zostać uwzględnione w klasyfikacji:

Nazwa/nazwisko opis
MyCode Tablica adresów URL lub plików sklasyfikowanych jako MyCode.
Biblioteki Tablica adresów URL lub plików sklasyfikowanych jako LibraryCode.
Niepowiązanych Tablica adresów URL lub plików sklasyfikowanych jako Niepowiązany kod.

Adres URL lub ciąg pliku może zawierać co najmniej jeden znak, który odpowiada zero lub więcej * znaków. * jest taka sama jak wyrażenie .*regularne .