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