내 코드만 사용하여 사용자 코드만 디버그
내 코드 시스템, 프레임워크 및 기타 비 사용자 코드 호출을 자동으로 단계별 수행하는 Visual Studio 디버깅 기능입니다. 호출 스택 창에서 Just My Code 기능이 이 호출들을 [외부 코드] 프레임으로 축소합니다.
내 코드만 .NET 및 C++ 프로젝트에서 다르게 작동합니다.
내 코드만 사용하거나 사용하지 않도록 설정
대부분의 프로그래밍 언어의 경우 내 코드만 기본적으로 사용하도록 설정됩니다.
- Visual Studio에서 내 코드만 사용하거나 사용하지 않도록 설정하려면 도구>옵션(또는 디버그>옵션) >디버깅>일반내 코드만 사용선택하거나 선택 취소합니다.
옵션 대화 상자에서 내 코드만 사용하도록 설정하는
옵션 대화 상자에서 내 코드만 사용하도록 설정하는
메모
내 코드만 사용하도록 모든 언어의 모든 Visual Studio 프로젝트에 적용되는 전역 설정입니다.
내 코드 디버깅만
디버깅 세션 중에 모듈 창에는 디버거가 내 코드(사용자 코드)로 취급하는 코드 모듈과 기호 로드 상태가 표시됩니다. 자세한 내용은 을 참조하여 디버거가 앱에 어떻게 연결되는지 더 익숙해지세요.
호출 스택 또는 작업 창에서 "Just My Code" 기능은 사용자 외 코드를 회색 주석으로 표시된 [External Code]
레이블 코드 프레임으로 축소합니다.
팁
모듈, 호출 스택, 작업또는 대부분의 다른 디버깅 창을 열려면 디버깅 세션에 있어야 합니다. 디버깅하는 동안 디버그>Windows아래에서 열려는 창을 선택합니다.
축소된 [외부 코드] 프레임에서 코드를 보려면 호출 스택 또는 작업 창을 마우스 오른쪽 단추로 클릭하고 상황에 맞는 메뉴에서 외부 코드 표시를 선택합니다. 확장된 외부 코드 줄은 [외부 코드] 프레임을 대체합니다.
메모
외부 코드 표시 사용자가 연 모든 언어의 모든 프로젝트에 적용되는 현재 사용자 프로파일러 설정입니다.
호출 스택 창에서 확장된 외부 코드 줄을 두 번 클릭하면 소스 코드에서 호출 코드 줄이 녹색으로 강조 표시됩니다. DLL 또는 다른 모듈을 찾거나 로드하지 않은 경우 기호나 원본을 찾을 수 없는 페이지가 열릴 수 있습니다.
Visual Studio 2022 버전 17.7부터 호출 스택 창에서 외부 코드를 두 번 클릭하여 .NET 코드를 자동으로 컴파일할 수 있습니다. 자세한 내용은 디버깅하는 동안 .NET 어셈블리에서 소스 코드 생성참조하세요.
.NET 내 코드만
.NET 프로젝트에서 내 코드만 기호(.pdb) 파일 및 프로그램 최적화를 사용하여 사용자 및 비 사용자 코드를 분류합니다. .NET 디버거는 최적화된 이진 파일 및 로드되지 않은 .pdb 파일을 비 사용자 코드로 간주합니다.
세 가지 컴파일러 특성은 .NET 디버거가 사용자 코드로 간주하는 것에도 영향을 줍니다.
- DebuggerNonUserCodeAttribute 적용된 코드가 사용자 코드가 아니라는 것을 디버거에 알릴 수 있습니다.
- DebuggerHiddenAttribute 내 코드만 꺼져 있더라도 디버거에서 코드를 숨깁니다.
- DebuggerStepThroughAttribute 디버거에게 코드를 단계별로 실행하지 않고 적용되는 코드를 단계별로 실행하도록 지시합니다.
.NET 디버거는 다른 모든 코드를 사용자 코드로 간주합니다.
.NET 디버깅 중:
- 디버그>단계에서 사용자 코드가 아닌 코드에서는 다음 사용자 코드 줄까지(또는 F11) 한 단계씩 넘어갑니다.
- 사용자 코드가 아닌 코드에서 디버그>단계 종료(또는 Shift+F11)을 하면 다음 사용자 코드 줄로 이동합니다.
사용자 코드가 더 이상 없으면 디버깅이 종료되거나 다른 중단점에 도달하거나 오류가 발생할 때까지 계속됩니다.
디버거가 사용자 이외의 코드에서 중단되는 경우(예: 디버그>모든 중단하고 사용자 코드가 아닌 코드에서 일시 중지) 소스 없음 창이 나타납니다. 그런 다음 디버그>단계 명령을 사용하여 다음 사용자 코드 줄로 이동합니다.
사용자 코드가 아닌 코드에서 처리되지 않은 예외가 발생하면 예외가 생성된 사용자 코드 줄에서 디버거가 중단됩니다.
예외에 대해 첫 번째 예외를 사용하도록 설정하면 호출하는 사용자 코드 줄이 소스 코드에서 녹색으로 강조 표시됩니다. 호출 스택 창에는 주석이 추가된 프레임이 [외부 코드]레이블로 표시됩니다.
C++ 내 코드만
Visual Studio 2017 버전 15.8부터 코드 디버깅에서 '내 코드만' 기능이 지원됩니다. 또한 이 기능을 사용하려면 /JMC(내 코드 디버깅만 해당) 컴파일러 스위치를 사용해야 합니다. 스위치는 기본적으로 C++ 프로젝트에서 사용하도록 설정됩니다. 호출 스택 창과 Just My Code에서의 호출 스택 지원을 위해 /JMC 스위치는 필요하지 않습니다.
사용자 코드로 분류되려면 사용자 코드를 포함하는 이진 파일의 PDB를 디버거에서 로드해야 합니다(모듈 창을 사용하여 로드 상태 확인).
호출 스택 창과 같은 호출 스택의 동작에서 C++의 '내 코드만 보기'는 이러한 함수들만을 비사용자 코드로 간주합니다.
- 기호 파일에 원본 정보가 제거된 함수입니다.
- 기호 파일이 스택 프레임에 해당하는 소스 파일이 없음을 나타내는 함수입니다.
- *.natjmc에 지정된 함수는 %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers 폴더의 파일을.
코드 단계별 동작에서, C++의 Just My Code 기능은 다음 함수들만을 사용자 코드가 아닌 코드 으로 간주합니다.
- 해당 PDB 파일이 디버거에 로드되지 않은 함수입니다.
- *.natjmc 파일에 지정된 함수는 %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers 폴더에 있는 파일에 있습니다.
메모
내 코드에서 코드 단계별 지원을 위해 Visual Studio 15.8 Preview 3 이상에서 MSVC 컴파일러를 사용하여 C++ 코드를 컴파일해야 하며 /JMC 컴파일러 스위치를 사용하도록 설정해야 합니다(기본적으로 사용하도록 설정됨). 자세한 내용은 C++ 호출 스택 및 코드 단계별 동작 사용자 지정 및 이 블로그 게시물 을 참조하세요. 이전 컴파일러를 사용하여 컴파일된 코드의 경우, 코드 스테핑을 사용자 지정하는 유일한 방법은 .natstepfilter 파일을 사용하는 것입니다. 이 방법은 'Just My Code'와는 독립적으로 작동합니다. C++ 단계별 동작 사용자 지정 참조하세요.
C++ 디버깅 중에는 기본적으로 사용자 코드가 아닌 코드를 건너뜁 있습니다. C++ 디버깅 중:
- 사용자 코드가 아닌 코드에서>한 단계씩(또는 F11)를 디버그하거나 사용자 코드가 아닌 코드에서 한 단계씩 호출되는 경우 사용자 코드의 다음 줄로 실행됩니다.
- 사용자가 아닌 코드에서 디버그>탈출(또는 Shift+F11)는 현재 스택 프레임을 벗어나 다음 사용자 코드 줄로 이동합니다.
사용자 코드가 더 이상 없으면 디버깅이 종료되거나 다른 중단점에 도달하거나 오류가 발생할 때까지 계속됩니다.
사용자 코드가 아닌 코드에서 디버거가 중단되는 경우(예: 디버그>모두 중단 포함한 이후 사용자 코드가 아닌 코드에서 일시 중지할 때), 해당 코드에서 단계별 실행이 계속됩니다.
디버거가 예외에 도달하면 사용자 코드인지 아니면 사용자 코드가 아닌지에 관계없이 예외가 중지됩니다. 사용자가 처리하지 않은 옵션은 예외 설정 대화 상자에서 무시됩니다.
C++ 호출 스택 및 코드 단계별 동작 사용자 지정
C++ 프로젝트의 경우 호출 스택 창에서 처리되는 모듈, 소스 파일 및 함수를 *.natjmc 파일에 지정하여 사용자가 아닌 코드로 처리할 수 있습니다. 이 사용자 지정은 최신 컴파일러를 사용하는 경우에도 코드 단계별로 적용됩니다(C++ 내 코드참조).
- Visual Studio 컴퓨터의 모든 사용자에 대해 사용자가 아닌 코드를 지정하려면 .natjmc 파일을 %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers 폴더에 추가합니다.
- 개별 사용자에 대해 사용자 이외의 코드를 지정하려면 %USERPROFILE%\My Documents\<Visual Studio 버전>\Visualizers 폴더에 .natjmc 파일을 추가합니다.
.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 와일드카드 문자 ? (0자 또는 1자) 및 * (0자 이상)를 사용할 수 있습니다. 예를 들어<Module Name="?:\3rdParty\UtilLibs\*" /> 는 모든 드라이브의 \3rdParty\UtilLibs 모든 모듈을 외부 코드로 처리하도록 디버거에 지시합니다. |
Company |
선택적. 실행 파일에 포함된 모듈을 게시하는 회사의 이름입니다. 이 특성을 사용하여 모듈을 명확하게 구분할 수 있습니다. |
File 요소 특성
속성 | 묘사 |
---|---|
Name |
필수. 외부 코드로 처리할 소스 파일 또는 파일의 전체 경로입니다. 경로를 지정할 때 windows 와일드카드 문자 ? 및 * 사용할 수 있습니다. |
함수 요소 특성
속성 | 설명 |
---|---|
Name |
필수. 외부 코드로 처리할 함수의 정규화된 이름입니다. 경로를 지정할 때 windows 와일드카드 문자 ? 및 * 사용할 수 있습니다. |
Module |
선택적. 함수를 포함하는 모듈의 이름 또는 전체 경로입니다. 이 특성을 사용하여 동일한 이름의 함수를 명확하게 구분할 수 있습니다. |
ExceptionImplementation |
true 설정하면 호출 스택은 이 함수가 아닌 예외를 throw한 함수를 표시합니다. |
Just My Code 설정과 관계없이 C++ 단계별 동작 사용자 정의
C++ 프로젝트에서는 *.natstepfilter 파일에 NoStepInto 함수로 나열하여 단계별로 실행할 함수를 지정할 수 있습니다. *.natstepfilter 파일에 나열된 함수는 내 코드만 설정에 종속되지 않습니다. NoStepInto 함수는 일부 StepInto 함수 또는 다른 사용자 코드를 호출하더라도 디버거에 함수를 단계별로 실행하도록 지시합니다. .natjmc나열된 함수와 달리 디버거는 NoStepInto 함수 내에서 사용자 코드의 첫 번째 줄로 한 단계씩 실행합니다.
- 모든 로컬 Visual Studio 사용자에 대해 사용자 이외의 코드를 지정하려면 .natstepfilter 파일을 %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers 폴더에 추가합니다.
- 개별 사용자에 대해 사용자 이외의 코드를 지정하려면 .natstepfilter 파일을 \My Documents\<Visual Studio 버전>\Visualizers 폴더에%USERPROFILE%추가합니다.
메모
일부 타사 확장은 .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 내 코드만
Visual Studio 2022의 .esproj 프로젝트의 경우 Visual Studio Code는 launch.json 파일을 사용하여 디버거를 구성하고 사용자 지정합니다. launch.json 디버거 구성 파일입니다.
Visual Studio는 사용자 코드에만 디버거를 연결합니다.
.esproj 프로젝트의 경우 Visual Studio에서 사용자 코드(즉, Just My Code 설정)를 launch.json내에서 skipFiles
설정을 사용하여 구성할 수 있습니다. 이 설정은 VS Code의 launch.json 설정과 동일하게 작동합니다.
skipFiles에 대한 자세한 내용은 중요하지 않은 코드 건너뛰기를 참조하세요.