Поделиться через


Отладка только пользовательского кода с помощью Just My Code

Just My Code — это функция отладки Visual Studio, которая автоматически пропускает вызовы к системному, библиотечному и другому непользовательскому коду. В окне стека вызовов только мой код сворачивает эти вызовы в [внешний код] кадров.

Просто мой код работает по-разному в проектах .NET и C++.

Включить или отключить опцию "Только мой код"

Для большинства языков программирования функция Just My Code включена по умолчанию.

  • Чтобы включить или отключить функцию Just My Code в Visual Studio, выберите в меню "Инструменты">"Параметры" (или в меню "Отладка">"Параметры") >выберите пункт"Отладка">"Общие"и отметьте или снимите флажок "Включить Just My Code".

Снимок экрана

Скриншот параметра

Заметка

Включить только мой код — это глобальный параметр, который применяется ко всем проектам Visual Studio на всех языках.

Отладка только моего кода

Во время сеанса отладки в окне модулей показано, какие модули кода отладчик рассматривает как Мой Код (пользовательский код), а также состояние загрузки символов. Дополнительные сведения см. в статье Узнайте, как отладчик подключается к приложению.

снимок экрана с пользовательским кодом в окне

снимок экрана с пользовательским кодом в окне

В окне стека вызовов или задач задачи просто мой код свернет код без пользователя в серый кадр кода с меткой [External Code].

скриншот кода внешнего источника в окне стека вызовов.

снимок экрана внешнего кода в окне стека вызовов.

Совет

Чтобы открыть модули , стек вызовов, задачи или большинство других окон отладки, необходимо находиться в сеансе отладки. При отладке в разделе Отладка>Windowsвыберите окна, которые нужно открыть.

Чтобы просмотреть код в свернутом [внешний код] окне, щелкните правой кнопкой мыши в окне стека вызовов или задач и выберите Показать внешний код в контекстном меню. Развернутые внешние строки кода заменяют кадр [внешний код].

снимок экрана: показать внешний код в окне стека вызовов.

Скриншот окна стека вызовов с командой

Заметка

показать внешний код — это текущий параметр профилировщика пользователей, который применяется ко всем проектам на всех языках, открытых пользователем.

Дважды щелкнув развернутую внешнюю строку кода в окне стека вызовов, в исходном коде выделена строка вызывающего кода зеленым цветом. Если библиотеки DLL или другие модули не найдены или не загружены, может открыться страница с сообщением об отсутствии символов или исходников.

Начиная с Visual Studio 2022 версии 17.7, можно автокомпилировать код .NET, дважды щелкнув внешний код в окне стека вызовов. Дополнительные сведения см. в статье Создание исходного кода из сборок .NET при отладке.

.NET Just My Code

В проектах .NET функция Just My Code использует файлы символов (.pdb) и оптимизацию программ для классификации пользовательского и непользовательского кода. Отладчик .NET считает оптимизированные двоичные файлы и не загруженные PDB-файлы не пользовательским кодом.

Три атрибута компилятора также влияют на то, что отладчик .NET считает пользовательским кодом:

  • DebuggerNonUserCodeAttribute сообщает отладчику, что примененный к нему код не является пользовательским кодом.
  • DebuggerHiddenAttribute скрывает код от отладчика, даже если функция "Только мой код" отключена.
  • DebuggerStepThroughAttribute инструктирует отладчик выполнять пошаговую обработку кода, к которому он применяется, вместо входа внутрь кода.

Отладчик .NET считает весь другой код пользовательским кодом.

Во время отладки .NET:

  • Отладка>Шаг внутрь (или F11) на этапе, не относящемся к пользовательскому коду, перепрыгивает к следующей строке пользовательского кода.
  • отладка>шаг выхода (или Shift+F11) в коде, отличном от пользователя, выполняется в следующей строке пользовательского кода.

Если нет больше пользовательского кода, отладка продолжается до тех пор, пока не завершится, не встретит другую точку останова или не возникнет ошибка.

Если отладчик прерывается в коде, не принадлежащем пользователю (например, вы используете отладка>"Остановить все" и приостанавливаетесь в не пользовательском коде), появится окно "Нет исходного". Затем можно использовать команду шага отладки>, чтобы перейти к следующей строке пользовательского кода.

Если необработанное исключение возникает в коде, отличном от пользователя, отладчик прерывается в строке пользовательского кода, в которой было создано исключение.

Если для исключения включены исключения первого шанса, вызываемая строка пользовательского кода выделена зеленым цветом в исходном коде. В окне стека вызовов отображается фрейм с аннотацией, помеченный [внешний код].

C++ просто мой код

Начиная с версии 15.8 Visual Studio 2017, также поддерживается функция "Just My Code" для пошаговой отладки кода. Для этой функции также требуется использование параметра компилятора /JMC (только отладка моего кода). Переключатель включен по умолчанию в проектах C++. Для окна стек вызовов и поддержки стека вызовов в режиме "Just My Code" параметр /JMC не требуется.

Чтобы классифицироваться как пользовательский код, PDB для двоичного файла, содержащего пользовательский код, необходимо загрузить отладчиком (используйте окно модулей для проверки состояния загрузки).

Для поведения стека вызовов, например, в окне стека вызовов , Just My Code в C++ рассматривает только эти функции как не-пользовательский код:

  • Функции с удаленной исходной информацией в их файле символов.
  • Функции, в которых файлы символов указывают на отсутствие исходного файла, соответствующего кадру стека.
  • Функции, указанные в файлах *.natjmc в папке %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.

Для поведения пошагового выполнения кода в C++ только эти функции считаются непользовательский код:

  • Функции, для которых соответствующий PDB-файл не загружен в отладчик.
  • Функции, указанные в файлах *.natjmc в папке %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.

Заметка

Для поддержки выполнения пошагового кода в функции "Только мой код", код C++ должен быть скомпилирован с помощью компиляторов MSVC в Visual Studio 15.8 Preview 3 или более поздней версии, а параметр компилятора /JMC должен быть включен (он включен по умолчанию). Дополнительные сведения см. в документе Настройка стека вызовов C++ и поведения пошагового выполнения кода и в записи блога . Для кода, скомпилированного с помощью старого компилятора, .natstepfilter-файлы являются единственным способом настройки пошагового выполнения кода, который не зависит от Just My Code. См. Настройка поведения C++ при пошаговой отладке.

во время отладки C++ непользовательский код пропускается по умолчанию. Во время отладки C++:

  • Отладка>Шагнуть внутрь (или F11) на коде, не принадлежащем пользователю, либо перейти на следующую строку пользовательского кода, если Шагнуть внутрь вызывается из кода, не принадлежащего пользователю.
  • Отладка>шаг выхода (или SHIFT+F11) в коде, отличном от пользователя, выполняется до следующей строки пользовательского кода (за пределами текущего кадра стека).

Если пользовательский код больше не доступен, отладка продолжается до тех пор, пока не завершится, не попадет в другую точку останова или не вызовет ошибку.

Если отладчик прерывается в коде, не относящемся к пользователю (например, используется отладка>прервать все и приостановить работу в коде, не относящемся к пользователю), шаг будет продолжаться в коде, не относящемся к пользователю.

Если отладчик сталкивается с исключением, он останавливается на исключении, будь то в пользовательском коде или коде системы. необработанные пользователем параметры в диалоговом окне "Параметры исключений " игнорируются.

Настройка стека вызовов C++ и поведения пошагового выполнения кода

Для проектов C++ можно указать модули, исходные файлы и функции, которые окно стека вызовов рассматривает как служебный код, указав их в файлах *.natjmc. Эта настройка также применяется к пошаговой отладке кода, если вы используете последний компилятор (см. раздел C++ Just My Code).

  • Чтобы указать непользовательский код для всех пользователей компьютера Visual Studio, добавьте файл .natjmc в папку %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
  • Чтобы указать код, не связанный с пользователем, добавьте файл .natjmc в папку %USERPROFILE%\My Documents\<версии Visual Studio>\Visualizers.

Файл .natjmc — это XML-файл с этим синтаксисом:

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

Атрибуты элемента Module

Атрибут Описание
Name Обязательно. Полный путь к модулю или модулям. Можно использовать подстановочные знаки Windows ? (ноль или один символ) и * (ноль или несколько символов). Например

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

сообщает отладчику обрабатывать все модули в \3rdParty\UtilLibs на любом диске как внешний код.
Company Необязательный. Имя компании, которая публикует модуль, внедренный в исполняемый файл. Этот атрибут можно использовать для разрешения неоднозначностей модулей.

атрибуты элемента файла

Атрибут Описание
Name Обязательно. Полный путь к исходному файлу или файлам для обработки как внешнего кода. При указании пути можно использовать подстановочные знаки Windows ? и *.

атрибуты элемента функции

Атрибут Описание
Name Обязательно. Полное имя функции для рассмотрения как внешнего кода. При указании пути можно использовать подстановочные знаки Windows ? и *.
Module Необязательный. Имя или полный путь к модулю, который содержит функцию. Этот атрибут можно использовать для диамбигуации функций с тем же именем.
ExceptionImplementation Если задано значение true, стек вызовов отображает функцию, которая вызвала исключение, а не эту функцию.

Настройка поведения шаговой отладки C++ независимо от параметров 'Только мой код'

В проектах C++ можно указать функции для пошагового выполнения, перечислив их как функции NoStepInto в файлах *.natstepfilter. Функции, перечисленные в *.natstepfilter файлах, не зависят от параметров "Только мой код". Функция NoStepInto сообщает отладчику перейти через функцию, даже если отладчик вызывает некоторые функции StepInto или другой код пользователя. В отличие от функций, перечисленных в .natjmc, отладчик переходит в первую строку пользовательского кода в функции NoStepInto.

  • Чтобы указать непользовательский код для всех локальных пользователей Visual Studio, добавьте файл .natstepfilter в папку %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
  • Чтобы задать код, не связанный с пользователем, добавьте файл .natstepfilter в папку %USERPROFILE%\My Documents\<Visual Studio version>\Visualizers.

Заметка

Некоторые сторонние расширения могут отключить функции .natstepfilter.

Файл .natstepfilter — это XML-файл с этим синтаксисом:

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

Элемент Описание
Function Обязательно. Указывает одну или несколько функций в качестве непользовательских функций.
Name Обязательно. Форматируемое регулярное выражение ECMA-262, указывающее полное имя функции, соответствующее. Например:

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

сообщает отладчику, что все методы в MyNS::MyClass должны считаться не пользовательским кодом. Совпадение зависит от регистра.
Module Необязательный. Отформатированное регулярное выражение ECMA-262, указывающее полный путь к модулю, содержащему функцию. Совпадение не учитывает регистр.
Action Обязательно. Одно из этих вариантов, чувствительных к регистру:

NoStepInto — сообщает отладчику пропустить выполнение функции.
StepInto — указывает отладчику войти в функцию, переопределяя любую другую NoStepInto для данной функции.

Дополнительные сведения о файлах .natstepfilter и .natjmc файлах

  • Начиная с Visual Studio 2022 версии 17.6, можно добавить .natjmc и .natstepfilter файлы непосредственно в решение или проект.

  • Синтаксические ошибки в файлах .natstepfilter и .natjmc не сообщаются в окне вывода отладчика.

  • В отличие от файлов .natvis , файлы .natstepfilter и .natjmc не загружаются повторно. Вместо этого эти файлы перезагрузятся в начале сеанса отладки.

  • Для функций шаблона использование &lt;.*&gt; или &lt;.* в имени может оказаться полезным.

JavaScript Только Мой Код

Для проектов .esproj в Visual Studio 2022, Visual Studio Code использует файл launch.json для настройки и кастомизации отладчика. launch.json — это файл конфигурации отладчика.

Visual Studio подключает отладчик только к пользовательскому коду. Для проектов .esproj можно настроить пользовательский код (то есть параметры Just My Code) в Visual Studio, используя настройку skipFiles в launch.json. Этот параметр работает так же, как и параметры launch.json в VS Code. Дополнительные сведения о skipFilesсм. в разделе Пропускание неинтересного кода.