Отладка только пользовательского кода с помощью 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 не загружаются повторно. Вместо этого эти файлы перезагрузятся в начале сеанса отладки.
Для функций шаблона использование
<.*>
или<.*
в имени может оказаться полезным.
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см. в разделе Пропускание неинтересного кода.