Udostępnij za pośrednictwem


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.

Zrzut ekranu przedstawiający opcję Włącz tylko mój kod w oknie dialogowym Opcje.

Zrzut ekranu przedstawiający opcję Włącz tylko mój kod w oknie dialogowym Opcje.

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).

Zrzut ekranu przedstawiający kod użytkownika w oknie Moduły.

Zrzut ekranu przedstawiający kod użytkownika w oknie Moduły.

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ą .

Zrzut ekranu przedstawiający kod zewnętrzny w oknie stosu wywołań.

Zrzut ekranu przedstawiający kod zewnętrzny w oknie stosu wywołań.

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].

Zrzut ekranu przedstawiający wyświetlanie kodu zewnętrznego w oknie stosu wywołań.

Zrzut ekranu przedstawiający wyświetlanie kodu zewnętrznego w oknie stosu wywołań.

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 (aby sprawdzić stan ładowania za pomocą okna Moduły ).

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 Ustawienia wyjątków 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). Na 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 natjmc 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

W przypadku projektów esproj w programie Visual Studio 2022 program Visual Studio Code używa pliku launch.json do konfigurowania i dostosowywania debugera. launch.json jest plikiem konfiguracji debugera.

Program Visual Studio dołącza debuger tylko do kodu użytkownika. W przypadku projektów esproj można skonfigurować kod użytkownika (czyli ustawienia Tylko mój kod) w programie Visual Studio przy użyciu skipFiles ustawienia w launch.json. To ustawienie działa tak samo jak ustawienia launch.json w programie VS Code. Aby uzyskać więcej informacji na temat skipFiles, zobacz Skipping Uninteresting Code (Pomijanie nieinterestowania kodu).