이 출시되었습니다! 11월의 새로운 기능 및 수정 사항을 읽어보세요.

디버깅

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에서의 디버깅을 참조하세요.

Debugging using Run and Debug

솔루션 탐색기를 사용하여 디버깅

C# Dev Kit 확장이 설치된 경우, 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하면 **디버그** 컨텍스트 메뉴가 나타납니다.

세 가지 옵션이 있습니다.

  • **새 인스턴스 시작** - 디버거가 연결된 상태로 프로젝트를 시작합니다.
  • **디버깅 없이 시작** - 디버거가 연결되지 않은 상태로 프로젝트를 실행합니다.
  • **새 인스턴스로 단계별 실행** - 디버거가 연결된 상태로 프로젝트를 시작하지만 코드의 진입점에서 중지합니다.

Debugging using Solution Explorer

명령 팔레트로 디버깅

C# Dev Kit 확장이 설치된 경우, 명령 팔레트 ⇧⌘P (Windows, Linux Ctrl+Shift+P)에서 **디버그: 디버깅 선택 및 시작** 명령을 사용하여 디버깅을 시작할 수도 있습니다.

참고: 이렇게 하면 디버그 드롭다운 목록에 시작 구성 항목이 추가됩니다.

Debugging using Command Palette

동적(메모리 내) 시작 구성으로 디버깅

C# Dev Kit 확장이 설치된 경우 동적 시작 구성을 만들 수 있습니다. 생성 방법은 프로젝트에 기존 launch.json 파일이 있는지 여부에 따라 달라집니다.

기존 launch.json

기존 launch.json 파일이 있는 경우 디버그 보기로 이동하여 드롭다운을 선택하고 C# 옵션을 선택할 수 있습니다. 그러면 드롭다운 목록에 추가할 수 있는 시작 대상 선택 항목이 표시됩니다. 선택 후 F5 또는 새로 생성된 구성으로 **디버깅 시작**을 누를 수 있습니다.

Add Dynamic C# Configuration

launch.json 없음

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

Debug with Show all automatic debug configurations

동적(메모리 내) 시작 구성 제거

명령 팔레트 ⇧⌘P (Windows, Linux Ctrl+Shift+P)와 **디버그: 디버깅 선택 및 시작** 명령을 사용하여 생성된 구성을 제거할 수 있습니다.

드롭다운에는 기존 디버그 구성이 모두 나열됩니다. 동적 구성 위로 마우스를 가져가면 오른쪽에 클릭 가능한 휴지통 아이콘이 나타납니다. 이 아이콘을 선택하여 동적 구성을 제거할 수 있습니다.

Remove dynamic configuration

편집기 디버그/실행 버튼으로 디버깅

편집기에서 .cs 파일이 열려 있으면 편집기 창의 오른쪽 상단 모서리에 있는 버튼을 통해 실행 및 디버그 옵션에 액세스할 수 있습니다. 이러한 작업은 현재 파일을 사용하여 프로젝트 시스템을 쿼리하고 시작할 관련 프로젝트를 결정합니다.

두 가지 옵션은 다음과 같습니다.

  • 이 파일과 관련된 프로젝트 실행: 디버그 어댑터를 사용하여 noDebug: true로 프로그램을 시작합니다.
  • 이 파일과 관련된 프로젝트 디버깅: 디버거 아래에서 프로그램을 시작합니다.

Editor Run or Debug

launch.json으로 디버깅

C# Dev Kit를 사용하는 경우 이 옵션을 사용하지 않는 것이 좋습니다. 하지만 디버그 구성을 직접 수정해야 하는 경우 C# 디버깅을 위한 launch.json 구성을 참조하세요.

프로세스에 연결

명령 팔레트 ⇧⌘P (Windows, Linux Ctrl+Shift+P)와 **디버그: .NET 5+ 또는 .NET Core 프로세스에 연결** 명령을 사용하여 C# 프로세스에 연결할 수 있습니다.

Attach to a C# process

구성 옵션

디버거를 구성하는 데 사용할 수 있는 많은 옵션과 설정이 있습니다. launchSettings.json, VS Code 사용자 설정을 사용하여 디버그 옵션을 수정하거나 launch.json을 직접 수정할 수 있습니다.

launchSettings.json

Visual Studio에서 launchSettings.json 파일이 있는 경우, F5로 실행 또는 명령 팔레트로 실행을 사용하여 프로필이 표시되는 것을 볼 수 있습니다.

Debugging using launchSettings.json

자세한 내용은 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이면 엔진 로깅에 adapterElapsedTimeengineElapsedTime 속성이 포함되어 요청이 소요된 시간을 마이크로초 단위로 나타냅니다. 이 옵션의 기본값은 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)가 지원됩니다. modeloadAllButExcluded로 설정되지 않은 경우 이 속성은 무시됩니다.
  • csharp.debug.symbolOptions.moduleFilter.includedModules - 디버거가 기호를 로드해야 하는 모듈의 배열입니다. 와일드카드(예: MyCompany.*.dll)가 지원됩니다. modeloadOnlyIncluded로 설정되지 않은 경우 이 속성은 무시됩니다.
  • csharp.debug.symbolOptions.moduleFilter.includeSymbolsNextToModules - true이면 includedModules 배열에 없는 모든 모듈에 대해 디버거는 모듈 자체와 시작 실행 파일 옆을 계속 확인하지만, 기호 검색 목록의 경로는 확인하지 않습니다. 이 옵션의 기본값은 true입니다. modeloadOnlyIncluded로 설정되지 않은 경우 이 속성은 무시됩니다.
  • csharp.debug.allowFastEvaluate - true(기본 상태)이면 디버거는 간단한 속성 및 메서드의 실행을 시뮬레이션하여 더 빠른 평가를 시도합니다.
  • csharp.experimental.debug.hotReload - true이면 대상 애플리케이션이 핫 리로드를 지원하는 경우 디버깅 중에 변경 사항을 적용할 수 있습니다. 자세한 내용은 사용자 설정을 참조하세요.
  • csharp.debug.hotReloadOnSave - true(기본 상태)이면 파일을 저장할 때 디버거가 코드 변경 사항을 자동으로 적용합니다.
  • csharp.debug.hotReloadVerbosity - **C# 핫 리로드** 출력 창에 대한 로깅 상세 수준을 제어합니다. minimal(기본값), detailed 또는 diagnostic으로 설정할 수 있습니다. 핫 리로드가 예상대로 작동하지 않기 시작하면 상세 수준을 높이는 것이 좋습니다.

중단점

C# 디버거는 소스 줄 중단점, 조건부 중단점, 로그포인트와 같은 다양한 중단점을 지원합니다.

중단점 - 조건부 중단점

식 평가의 도움을 받아 디버거는 조건부 중단점도 지원합니다. 식이 true로 평가될 때 중단하도록 중단점을 설정할 수 있습니다.

Conditional Breakpoints

중단점 - 함수 중단점

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

Function Breakpoints

중단점 - 로그포인트

로그포인트(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

LogMessage Breakpoint

중단점 - 트리거된 중단점

트리거된 중단점은 다른 중단점이 히트되면 자동으로 활성화되는 중단점입니다. 특정 사전 조건 후에만 발생하는 코드의 실패 사례를 진단할 때 매우 유용할 수 있습니다.

트리거된 중단점은 글리프 여백을 마우스 오른쪽 버튼으로 클릭하고 트리거된 중단점 추가를 선택한 다음 어떤 다른 중단점이 중단점을 활성화하는지 선택하여 설정할 수 있습니다.

예외에서 중지

C# 디버거는 예외가 발생하거나 잡힐 때 중지하는 구성 옵션을 지원합니다. 이는 **실행** 보기의 **중단점** 섹션에 있는 두 가지 항목을 통해 수행됩니다.

Exceptions settings in BREAKPOINTS Run View

참고: C# 디버거로 폴더를 처음 디버깅할 때까지 **중단점** 섹션에 이러한 항목이 표시되지 않습니다.

**모든 예외**를 선택하면 예외가 발생할 때 디버거가 중지하도록 구성됩니다. 내 코드만이 활성화된 경우(기본값), 라이브러리 코드에서 내부적으로 예외가 발생하고 잡히더라도 디버거는 중단되지 않습니다. 그러나 라이브러리 코드에서 예외가 발생하여 사용자 코드로 반환되면 디버거가 중단됩니다.

**사용자 처리되지 않은 예외**를 선택하면 사용자 코드에서 발생했거나 사용자 코드를 통과한 후 비사용자 코드에서 잡힌 예외가 발생할 때 디버거가 중지하도록 구성됩니다. 사용자에게 처리되지 않는 예외가 항상 프로세스 디버깅 중인 버그는 아닙니다. API를 구현하는 사용자 코드가 예외를 발생시킬 것으로 예상될 수 있습니다. 많은 경우 실제 문제가 있으므로 기본적으로 디버거는 예외가 사용자에게 처리되지 않을 때 중단됩니다.

예외 조건

두 체크박스 모두 선택한 예외 유형만 중단하는 조건부 설정을 지원합니다. 조건을 편집하려면 연필 아이콘(위 이미지 참조)을 선택하거나 항목을 마우스 오른쪽 버튼으로 클릭하고 **조건 편집**을 호출합니다. 조건은 중단할 예외 유형의 쉼표로 구분된 목록이거나, 목록이 '!'로 시작하는 경우 무시할 예외 유형의 목록입니다.

예제 조건

예제 조건 값 결과
System.NullReferenceException null 참조 예외에서만 중단됩니다.
System.NullReferenceException, System.InvalidOperationException null 참조 예외와 잘못된 작업 예외 모두에서 중단됩니다.
!System.Threading.Tasks.TaskCanceledException 작업 취소된 예외를 제외한 모든 예외에서 중단됩니다.
!System.Threading.Tasks.TaskCanceledException, System.NotImplementedException 작업 취소된 예외와 구현되지 않은 예외를 제외한 모든 예외에서 중단됩니다.

식 평가

디버거를 사용하면 **감시** 창 및 디버그 콘솔에서 식을 평가할 수 있습니다.

핫 리로드

C# Dev Kit 확장이 설치되면 디버거를 사용하여 디버깅하는 동안 C# 코드 변경 사항을 적용할 수 있습니다.

Hot Reload displayed in the debugging toolbar

핫 리로드를 활성화하려면 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)
중단점 등에서 멈춘 휴지 상태일 때 변경 사항이 발생하면 이러한 명령은 자동으로 적용합니다.

Hot Reload demonstrated on ASP.NET

다음 단계

자세한 내용은 계속 읽어보세요.

  • 디버깅 - 모든 언어에 대해 프로젝트에 VS Code 디버거를 사용하는 방법을 알아보세요.
© . This site is unofficial and not affiliated with Microsoft.