디버깅
Visual Studio Code에서 Microsoft C# 확장을 사용하여 C# 애플리케이션을 디버깅할 수 있습니다.
실행 및 디버그
C# 확장과 C# Dev Kit은 C# 애플리케이션을 실행하고 디버깅하는 여러 방법을 제공합니다.
C# Dev Kit 없이 실행 및 디버깅하려면 Microsoft C# 확장 GitHub 페이지에서 문서를 참조하세요.
F5로 디버깅
C# Dev Kit 확장이 설치되어 있고 디버그 보기에서 선택할 수 있는 디버그 구성이 없는 경우, .cs 파일을 열고 F5를 눌러 프로젝트 디버깅을 시작할 수 있습니다. 디버거가 자동으로 프로젝트를 찾아 디버깅을 시작합니다. 프로젝트가 여러 개인 경우 어떤 프로젝트를 디버깅할지 묻는 메시지가 표시됩니다.
VS Code 사이드바의 **실행 및 디버그** 보기에서 디버깅 세션을 시작할 수도 있습니다. 자세한 내용은 VS Code에서의 디버깅을 참조하세요.

솔루션 탐색기를 사용하여 디버깅
C# Dev Kit 확장이 설치된 경우, 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하면 **디버그** 컨텍스트 메뉴가 나타납니다.
세 가지 옵션이 있습니다.
- **새 인스턴스 시작** - 디버거가 연결된 상태로 프로젝트를 시작합니다.
- **디버깅 없이 시작** - 디버거가 연결되지 않은 상태로 프로젝트를 실행합니다.
- **새 인스턴스로 단계별 실행** - 디버거가 연결된 상태로 프로젝트를 시작하지만 코드의 진입점에서 중지합니다.

명령 팔레트로 디버깅
C# Dev Kit 확장이 설치된 경우, 명령 팔레트 ⇧⌘P (Windows, Linux Ctrl+Shift+P)에서 **디버그: 디버깅 선택 및 시작** 명령을 사용하여 디버깅을 시작할 수도 있습니다.
참고: 이렇게 하면 디버그 드롭다운 목록에 시작 구성 항목이 추가됩니다.

동적(메모리 내) 시작 구성으로 디버깅
C# Dev Kit 확장이 설치된 경우 동적 시작 구성을 만들 수 있습니다. 생성 방법은 프로젝트에 기존 launch.json 파일이 있는지 여부에 따라 달라집니다.
기존 launch.json
기존 launch.json 파일이 있는 경우 디버그 보기로 이동하여 드롭다운을 선택하고 C# 옵션을 선택할 수 있습니다. 그러면 드롭다운 목록에 추가할 수 있는 시작 대상 선택 항목이 표시됩니다. 선택 후 F5 또는 새로 생성된 구성으로 **디버깅 시작**을 누를 수 있습니다.

launch.json 없음
프로젝트에 launch.json 파일이 없는 경우, 디버그 보기의 **모든 자동 디버그 구성 표시**에서 이러한 동적 구성을 추가하고 액세스할 수 있습니다.

동적(메모리 내) 시작 구성 제거
명령 팔레트 ⇧⌘P (Windows, Linux Ctrl+Shift+P)와 **디버그: 디버깅 선택 및 시작** 명령을 사용하여 생성된 구성을 제거할 수 있습니다.
드롭다운에는 기존 디버그 구성이 모두 나열됩니다. 동적 구성 위로 마우스를 가져가면 오른쪽에 클릭 가능한 휴지통 아이콘이 나타납니다. 이 아이콘을 선택하여 동적 구성을 제거할 수 있습니다.

편집기 디버그/실행 버튼으로 디버깅
편집기에서 .cs 파일이 열려 있으면 편집기 창의 오른쪽 상단 모서리에 있는 버튼을 통해 실행 및 디버그 옵션에 액세스할 수 있습니다. 이러한 작업은 현재 파일을 사용하여 프로젝트 시스템을 쿼리하고 시작할 관련 프로젝트를 결정합니다.
두 가지 옵션은 다음과 같습니다.
-
이 파일과 관련된 프로젝트 실행: 디버그 어댑터를 사용하여noDebug: true로 프로그램을 시작합니다. -
이 파일과 관련된 프로젝트 디버깅: 디버거 아래에서 프로그램을 시작합니다.

launch.json으로 디버깅
C# Dev Kit를 사용하는 경우 이 옵션을 사용하지 않는 것이 좋습니다. 하지만 디버그 구성을 직접 수정해야 하는 경우 C# 디버깅을 위한 launch.json 구성을 참조하세요.
프로세스에 연결
명령 팔레트 ⇧⌘P (Windows, Linux Ctrl+Shift+P)와 **디버그: .NET 5+ 또는 .NET Core 프로세스에 연결** 명령을 사용하여 C# 프로세스에 연결할 수 있습니다.

구성 옵션
디버거를 구성하는 데 사용할 수 있는 많은 옵션과 설정이 있습니다. launchSettings.json, VS Code 사용자 설정을 사용하여 디버그 옵션을 수정하거나 launch.json을 직접 수정할 수 있습니다.
launchSettings.json
Visual Studio에서 launchSettings.json 파일이 있는 경우, F5로 실행 또는 명령 팔레트로 실행을 사용하여 프로필이 표시되는 것을 볼 수 있습니다.

자세한 내용은 C# 디버깅 구성을 참조하세요.
사용자 설정
C# 디버거를 사용하는 동안 변경하려는 설정이 있는 경우, **파일** > **기본 설정** > **설정** (⌘, (Windows, Linux Ctrl+,))에서 해당 옵션을 검색하여 찾을 수 있습니다.
csharp.debug.stopAtEntry- true이면 디버거가 대상의 진입점에서 중지해야 합니다. 이 옵션의 기본값은false입니다.csharp.debug.console- 콘솔 프로젝트를 시작할 때 대상 프로그램이 시작될 콘솔을 나타냅니다. **참고:** 이 옵션은 'dotnet' 디버그 구성 유형에만 사용됩니다.internalConsole[기본값] - VS Code의 디버그 콘솔. 이 모드를 사용하면 디버거와 대상 프로그램의 메시지를 한 곳에서 볼 수 있습니다. 자세한 내용은 전체 설명서를 참조하세요.integratedTerminal- VS Code의 통합 터미널.externalTerminal- 사용자 설정을 통해 구성할 수 있는 외부 터미널.
csharp.debug.sourceFileMap- 빌드 시간 경로를 로컬 소스 위치에 매핑합니다. 빌드 시간 경로의 모든 인스턴스가 로컬 소스 경로로 대체됩니다.
예
{\"<build-path>\":\"<local-source-path>\"}csharp.debug.justMyCode- 사용하도록 설정된 경우(기본값), 디버거는 시스템 코드 및 최적화되었거나 디버깅 기호가 없는 다른 코드를 무시하고 사용자 코드("내 코드")만 표시하고 해당 코드로 단계별 실행합니다. 더 많은 정보.csharp.debug.requireExactSource- PDB와 현재 소스 코드가 일치해야 하는 플래그입니다. 이 옵션의 기본값은true입니다.csharp.debug.enableStepFiltering- 속성 및 연산자를 건너뛰도록 설정하는 플래그입니다. 이 옵션의 기본값은true입니다.csharp.debug.logging.exceptions- 예외 메시지가 출력 창에 기록되어야 하는지 여부를 결정하는 플래그입니다. 이 옵션의 기본값은true입니다.csharp.debug.logging.moduleLoad- 모듈 로드 이벤트가 출력 창에 기록되어야 하는지 여부를 결정하는 플래그입니다. 이 옵션의 기본값은true입니다.csharp.debug.logging.programOutput- 외부 콘솔을 사용하지 않을 때 프로그램 출력이 출력 창에 기록되어야 하는지 여부를 결정하는 플래그입니다. 이 옵션의 기본값은true입니다.csharp.debug.logging.diagnosticsLog- 디버거 관련 문제를 진단하는 데 사용되는 다양한 설정입니다.csharp.debug.logging.browserStdOut- 웹 브라우저를 시작하는 stdout 텍스트가 출력 창에 기록되어야 하는지 여부를 결정하는 플래그입니다. 이 옵션의 기본값은true입니다.csharp.debug.logging.elapsedTiming- true이면 엔진 로깅에adapterElapsedTime및engineElapsedTime속성이 포함되어 요청이 소요된 시간을 마이크로초 단위로 나타냅니다. 이 옵션의 기본값은false입니다.csharp.debug.logging.threadExit- 대상 프로세스의 스레드가 종료될 때 메시지가 기록되는지 제어합니다. 이 옵션의 기본값은false입니다.csharp.debug.logging.processExit- 대상 프로세스가 종료되거나 디버깅이 중지될 때 메시지가 기록되는지 제어합니다. 이 옵션의 기본값은true입니다.csharp.debug.suppressJITOptimizations- true이면 최적화된 모듈(.dll이 릴리스 구성으로 컴파일됨)이 대상 프로세스에 로드될 때 디버거가 JIT 컴파일러에 최적화가 비활성화된 코드를 생성하도록 요청합니다. 더 많은 정보csharp.debug.symbolOptions.searchPaths- .pdb 파일을 검색할 기호 서버 URL(예:http://MyExampleSymbolServer) 또는 디렉터리(예: /build/symbols) 배열입니다. 이러한 디렉터리는 모듈 옆의 기본 위치와 PDB가 원래 드롭된 경로 외에 추가로 검색됩니다.csharp.debug.symbolOptions.searchMicrosoftSymbolServer-true이면 Microsoft 기호 서버(https://msdl.microsoft.com/download/symbols)가 기호 검색 경로에 추가됩니다. 지정하지 않으면 이 옵션의 기본값은false입니다.csharp.debug.symbolOptions.searchNuGetOrgSymbolServer-true이면 NuGet.org 기호 서버(https://symbols.nuget.org/download/symbols)가 기호 검색 경로에 추가됩니다. 지정하지 않으면 이 옵션의 기본값은false입니다.csharp.debug.symbolOptions.cachePath- 기호 서버에서 다운로드한 기호를 캐시할 디렉터리입니다. 지정하지 않으면 Windows에서는 디버거가%TEMP%\\SymbolCache로 기본 설정되고, Linux 및 macOS에서는 디버거가~/.dotnet/symbolcache로 기본 설정됩니다.csharp.debug.symbolOptions.moduleFilter.mode- 모듈 필터가 작동하는 두 가지 기본 운영 모드 중 어떤 모드인지 제어합니다.loadAllButExcluded- 모듈이excludedModules배열에 있는 경우를 제외하고 모든 모듈의 기호를 로드합니다.loadOnlyIncluded-includedModules배열에 있거나includeSymbolsNextToModules설정을 통해 포함된 모듈을 제외하고는 어떤 모듈의 기호도 로드하려고 시도하지 않습니다.
csharp.debug.symbolOptions.moduleFilter.excludedModules- 디버거가 기호를 로드해서는 안 되는 모듈의 배열입니다. 와일드카드(예: MyCompany.*.dll)가 지원됩니다.mode가loadAllButExcluded로 설정되지 않은 경우 이 속성은 무시됩니다.csharp.debug.symbolOptions.moduleFilter.includedModules- 디버거가 기호를 로드해야 하는 모듈의 배열입니다. 와일드카드(예: MyCompany.*.dll)가 지원됩니다.mode가loadOnlyIncluded로 설정되지 않은 경우 이 속성은 무시됩니다.csharp.debug.symbolOptions.moduleFilter.includeSymbolsNextToModules- true이면includedModules배열에 없는 모든 모듈에 대해 디버거는 모듈 자체와 시작 실행 파일 옆을 계속 확인하지만, 기호 검색 목록의 경로는 확인하지 않습니다. 이 옵션의 기본값은true입니다.mode가loadOnlyIncluded로 설정되지 않은 경우 이 속성은 무시됩니다.csharp.debug.allowFastEvaluate- true(기본 상태)이면 디버거는 간단한 속성 및 메서드의 실행을 시뮬레이션하여 더 빠른 평가를 시도합니다.csharp.experimental.debug.hotReload- true이면 대상 애플리케이션이 핫 리로드를 지원하는 경우 디버깅 중에 변경 사항을 적용할 수 있습니다. 자세한 내용은 사용자 설정을 참조하세요.csharp.debug.hotReloadOnSave- true(기본 상태)이면 파일을 저장할 때 디버거가 코드 변경 사항을 자동으로 적용합니다.csharp.debug.hotReloadVerbosity- **C# 핫 리로드** 출력 창에 대한 로깅 상세 수준을 제어합니다.minimal(기본값),detailed또는diagnostic으로 설정할 수 있습니다. 핫 리로드가 예상대로 작동하지 않기 시작하면 상세 수준을 높이는 것이 좋습니다.
중단점
C# 디버거는 소스 줄 중단점, 조건부 중단점, 로그포인트와 같은 다양한 중단점을 지원합니다.
중단점 - 조건부 중단점
식 평가의 도움을 받아 디버거는 조건부 중단점도 지원합니다. 식이 true로 평가될 때 중단하도록 중단점을 설정할 수 있습니다.

중단점 - 함수 중단점
디버거는 함수 중단점도 지원합니다. 디버그 창의 중단점 섹션에서 +를 클릭하여 특정 함수에서 중단하도록 중단점을 설정할 수 있습니다.

중단점 - 로그포인트
로그포인트(Visual Studio의 추적 포인트라고도 함)를 사용하면 코드를 수정하지 않고 디버그 콘솔로 출력을 보낼 수 있습니다. 중단점과 다르며 애플리케이션의 실행 흐름을 중단하지 않습니다.
로그포인트를 추가하려면 코드 줄 옆의 가장 왼쪽 여백을 마우스 오른쪽 버튼으로 클릭합니다. **로그포인트 추가**를 선택하고 기록하려는 메시지를 입력합니다. 중괄호('{', '}') 사이의 모든 식은 로그포인트가 히트될 때 평가됩니다.
다음 토큰도 메시지에서 지원됩니다.
| 토큰 | 설명 | 예제 출력 |
|---|---|---|
| $FILEPOS | 현재 소스 파일 위치 | C:\sources\repos\Project\Program.cs:4 |
| $FUNCTION | 현재 함수 이름 | Program.<Main>$ |
| $ADDRESS | 현재 명령어 | 0x00007FFF83A54001 |
| $TID | 스레드 ID | 20668 |
| $PID | 프로세스 ID | 10028 |
| $TNAME | 스레드 이름 | <스레드 이름 없음> |
| $PNAME | 프로세스 이름 | C:\sources\repos\Project\bin\Debug\net7.0\console.exe |
| $CALLER | 호출 함수 이름 | void console.dll!Program.Foo() |
| $CALLSTACK | 호출 스택 | void console.dll!Program.Bar() void console.dll!Program.Foo() void console.dll!Program.<Main>$(string[] args) [외부 코드] |
| $TICK | 틱 카운트(Windows GetTickCount에서) | 28194046 |
| $HITCOUNT | 이 중단점이 히트된 횟수 | 5 |

중단점 - 트리거된 중단점
트리거된 중단점은 다른 중단점이 히트되면 자동으로 활성화되는 중단점입니다. 특정 사전 조건 후에만 발생하는 코드의 실패 사례를 진단할 때 매우 유용할 수 있습니다.
트리거된 중단점은 글리프 여백을 마우스 오른쪽 버튼으로 클릭하고 트리거된 중단점 추가를 선택한 다음 어떤 다른 중단점이 중단점을 활성화하는지 선택하여 설정할 수 있습니다.
예외에서 중지
C# 디버거는 예외가 발생하거나 잡힐 때 중지하는 구성 옵션을 지원합니다. 이는 **실행** 보기의 **중단점** 섹션에 있는 두 가지 항목을 통해 수행됩니다.

참고: C# 디버거로 폴더를 처음 디버깅할 때까지 **중단점** 섹션에 이러한 항목이 표시되지 않습니다.
**모든 예외**를 선택하면 예외가 발생할 때 디버거가 중지하도록 구성됩니다. 내 코드만이 활성화된 경우(기본값), 라이브러리 코드에서 내부적으로 예외가 발생하고 잡히더라도 디버거는 중단되지 않습니다. 그러나 라이브러리 코드에서 예외가 발생하여 사용자 코드로 반환되면 디버거가 중단됩니다.
**사용자 처리되지 않은 예외**를 선택하면 사용자 코드에서 발생했거나 사용자 코드를 통과한 후 비사용자 코드에서 잡힌 예외가 발생할 때 디버거가 중지하도록 구성됩니다. 사용자에게 처리되지 않는 예외가 항상 프로세스 디버깅 중인 버그는 아닙니다. API를 구현하는 사용자 코드가 예외를 발생시킬 것으로 예상될 수 있습니다. 많은 경우 실제 문제가 있으므로 기본적으로 디버거는 예외가 사용자에게 처리되지 않을 때 중단됩니다.
예외 조건
두 체크박스 모두 선택한 예외 유형만 중단하는 조건부 설정을 지원합니다. 조건을 편집하려면 연필 아이콘(위 이미지 참조)을 선택하거나 항목을 마우스 오른쪽 버튼으로 클릭하고 **조건 편집**을 호출합니다. 조건은 중단할 예외 유형의 쉼표로 구분된 목록이거나, 목록이 '!'로 시작하는 경우 무시할 예외 유형의 목록입니다.
예제 조건
| 예제 조건 값 | 결과 |
|---|---|
| System.NullReferenceException | null 참조 예외에서만 중단됩니다. |
| System.NullReferenceException, System.InvalidOperationException | null 참조 예외와 잘못된 작업 예외 모두에서 중단됩니다. |
| !System.Threading.Tasks.TaskCanceledException | 작업 취소된 예외를 제외한 모든 예외에서 중단됩니다. |
| !System.Threading.Tasks.TaskCanceledException, System.NotImplementedException | 작업 취소된 예외와 구현되지 않은 예외를 제외한 모든 예외에서 중단됩니다. |
식 평가
디버거를 사용하면 **감시** 창 및 디버그 콘솔에서 식을 평가할 수 있습니다.
핫 리로드
C# Dev Kit 확장이 설치되면 디버거를 사용하여 디버깅하는 동안 C# 코드 변경 사항을 적용할 수 있습니다.

핫 리로드를 활성화하려면 csharp.experimental.debug.hotReload를 true로 설정해야 합니다. 자세한 내용은 사용자 설정을 참조하세요. 핫 리로드 세션은 대상 디버거 엔진이 코드 변경 사항 적용을 지원하는 경우에만 시작됩니다.
지원되는 프로젝트 및 시나리오
C# Dev Kit는 "클래식" 핫 리로드 환경, 즉 편집 및 계속 기능을 지원합니다. 중단점에서 중지했거나 프로그램이 실행 중인지 여부에 관계없이 디버깅하는 동안 코드 변경 사항을 적용할 수 있습니다.
2023년 11월 기준으로 MetadataUpdateHandler와 같이 ASP.NET Core 애플리케이션이 변경 사항이 발생한 후 브라우저를 자동으로 새로고침하도록 하는 기능은 아직 사용할 수 없습니다. 디버깅 없이 코드 변경 사항을 적용하는 것도 지원되지 않습니다. 변경 후.
.NET 8은 Linux/macOS에서 디버깅하면서 변경 사항을 적용하는 기능을 지원하므로, 해당 운영 체제에서 실행되는 .NET 앱의 코드 변경 사항을 적용하려면 .NET 8+ 런타임 버전이 필요합니다.
| 애플리케이션 유형 | C# Dev Kit로 핫 리로드 지원 | .NET 8+ 필수 |
|---|---|---|
| 콘솔 | ✅ | Linux/macOS 전용 |
| 테스트 프로젝트 | ✅ | Linux/macOS 전용 |
| 클래스 라이브러리 프로젝트 | ✅ | Linux/macOS 전용 |
| ASP.NET Core | ⚠️* 현재 .cs 파일의 변경 사항만 지원합니다 |
Linux/macOS 전용 |
| MAUI | ❌* 곧 제공될 예정 | -- |
| Unity | ❌ | -- |
현재 C# Dev Kit에서 지원하는 프로젝트에 대한 자세한 내용은 지원되는 프로젝트를 참조하세요. 또한 지원되지 않는 다른 시나리오에 대한 자세한 내용은 C# Dev Kit FAQ를 참조하세요.
코드 변경 사항 적용 방법
핫 리로드 세션이 시작되고 새 변경 사항이 적용되면 다음 작업 중 하나를 사용하여 애플리케이션에 이러한 변경 사항을 적용할 수 있습니다.
| 작업 | 설명 |
|---|---|
| 핫 리로드 Ctrl+Shift+Enter |
**디버그 도구 모음**에서 사용 가능한 코드 변경 사항 적용. |
| 파일 저장 ⌘S (Windows, Linux Ctrl+S) |
csharp.debug.hotReloadOnSave가 true로 설정된 경우 코드 변경 사항 적용을 시작합니다. 자세한 내용은 사용자 설정을 참조하세요. |
| 계속 / 단계별 실행 / 단계별 진입 / 단계별 나가기 F5 / F10 / F11 / ⇧F11 (Windows, Linux Shift+F11) |
중단점 등에서 멈춘 휴지 상태일 때 변경 사항이 발생하면 이러한 명령은 자동으로 적용합니다. |

다음 단계
자세한 내용은 계속 읽어보세요.
- 디버깅 - 모든 언어에 대해 프로젝트에 VS Code 디버거를 사용하는 방법을 알아보세요.