Visual Studio의 .NET 디버거 이해

완료됨

이전 단원에서는 디버거를 사용하여 프로그램 실행을 제어하고 프로그램 상태를 관찰할 수 있다는 것을 학습했습니다. 이 섹션에서는 Visual Studio에서 이 두 작업을 모두 수행하는 방법을 알아봅니다.

.NET에서 Visual Studio 디버거를 사용하는 방법부터 먼저 알아봅니다.

Visual Studio 디버거 시작

Visual Studio 명령 모음의 시작 단추(단색 녹색 삼각형)를 사용하여 디버거가 연결된 애플리케이션을 시작합니다. 이제 명령 모음에 프로젝트 이름이 포함됩니다. 앱이 실행되면 추가 디버깅 도구 및 기능을 사용할 수 있게 됩니다.

Visual Studio 디버깅 컨트롤의 스크린샷

  1. 솔루션 구성은 디버그 또는 릴리스 모드에서 앱을 실행할지 여부를 지정
  2. 플랫폼 구성은 대상 CPU 플랫폼을 지정
  3. 디버거가 연결된 앱을 시작
  4. 디버거가 연결되지 않은 앱을 시작

실행 제어

앱이 실행되면 앱을 시작하기 위해 클릭한 시작 단추 옆에 디버깅 컨트롤이 표시됩니다.

Visual Studio 디버거 실행 컨트롤의 스크린샷

  • 1) 실행을 계속하거나 일시 중지합니다. 중단점에서 실행이 일시 중지된 경우 다음 중단점에 도달할 때까지 계속하려면 이 단추를 선택합니다. 프로그램이 실행 중이면 단추가 실행을 일시 중지하는 데 사용할 수 있는 일시 중지 단추로 전환됩니다.
  • 2) 핫 다시 로드 컨트롤. Visual Studio 2022에서 도입된 이 기능을 사용하면 앱을 다시 시작하지 않고도 코드를 변경하고 새로 고칠 수 있습니다.
  • 3) 중지합니다. 이 단추는 실행 중인 애플리케이션을 중지하며 디버거도 분리합니다.
  • 4) 다시 시작합니다. 디버거가 연결된 앱을 중지 후 다시 시작합니다.
  • 5) 한 단계씩 코드 실행. 다음 문이 함수 호출인 경우, 이 함수의 첫 번째 코드 문으로 내려갑니다(step 명령과 동일).
  • 6) 스텝 오버. 다음 문이 함수 호출인 경우, 코드를 실행하고 다만 현재 함수의 다음 코드 줄로 즉시 이동합니다.
  • 7) 실행 종료. 함수 내부에 있는 경우 이 함수의 나머지 코드를 실행하고 초기 함수 호출 후 문으로 out 명령과 동일한 방식으로 다시 이동합니다.

중단점은 디버깅의 핵심 기능 중 하나이며 이러한 컨트롤과 통합되므로 좀 더 자세히 살펴보겠습니다.

중단점

이전 단원에서 학습한 바와 같이, 디버거를 사용하여 프로그램 실행을 분석하고 제어할 수 있습니다. Visual Studio 디버거가 연결된 상태에서 앱을 시작하면 코드가 즉시 실행되기 시작합니다. 코드가 매우 빠르게 실행되므로 모든 문에서 프로그램을 일시 중지할 수 있어야 합니다. 이를 위해서 중단점을 사용합니다.

중단하려는 줄에서 줄 번호 왼쪽을 클릭하면 Visual Studio에서 중단점을 추가할 수 있습니다. 중단점을 사용하도록 설정한 후에는 빨간색 원이 표시됩니다. 제거하려면 빨간색 원을 다시 선택합니다.

Visual Studio 편집기 창에 추가된 중단점의 스크린샷

마우스 오른쪽 단추를 클릭하여 중단점을 추가하거나 기존 중단점을 마우스 오른쪽 단추로 클릭하면 조건부 중단점 추가를 선택할 수도 있습니다. 이 특별한 유형의 중단점을 사용하면 중단점이 트리거되는 경우에 대한 조건 또는 기준을 정의할 수 있습니다. 또한 이 메뉴를 사용하면 다음 중단점이 적중 옵션인 경우에만 사용을 선택하여 다른 작업 중에서 체인 가능한 중단점 실행을 만들 수 있습니다.

Visual Studio에서 조건부 중단점을 설정하는 스크린샷

코드를 한 번만 중단하려는 경우 임시 중단점을 사용할 수도 있습니다. 중단점 열을 마우스 오른쪽 단추로 클릭하고 임시 중단점 삽입을 선택하여 임시 중단점을 적용할 수 있습니다. 임시 중단점은 처음 도달한 후 제거됩니다.

중단점 열을 마우스 오른쪽 단추로 클릭하고 추적점 삽입을 선택하여 추적점을 추가할 수도 있습니다. 추적점을 사용하면 코드 실행을 수정하거나 중지하지 않고도 구성 가능한 조건에서 출력 창에 정보를 기록할 수 있습니다.

마지막으로 중단점 창(Windows>중단점>)에서 코드에 배치한 모든 중단점을 보고 전환할 수 있습니다. catch된 예외 또는 catch되지 않은 예외에서 중단하도록 옵션을 설정/해제할 수도 있습니다. 중단점 패널을 사용하여 프로그램 상태를 검사하고 호출 스택을 사용하여 예외의 원본을 추적할 수 있습니다.

Visual Studio 중단점 창의 스크린샷

Visual Studio 디버깅 도구

중단점을 설정하고 앱을 시작하면 새로운 정보 창과 컨트롤이 화면에 표시됩니다.

Visual Studio 디버거 개요의 스크린샷.

  1. 디버거 시작 컨트롤입니다.
  2. 현재 중단점 및 실행 줄입니다.
  3. 변수 값을 모니터링하기 위한 감시 창입니다.
  4. 모든 중단점을 보기 위한 중단점 창입니다.

위쪽 탐색 모음을 따라 디버그>Windows 를 선택하여 다른 유용한 디버깅 창에 액세스할 수도 있습니다. 예를 들어 일반적으로 사용되는 도구는 다음과 같습니다.

  1. 호출 스택 창: 호출된 메서드를 볼 수 있습니다.
  2. 직접 실행 창: 디버깅하는 동안 식을 작성하고 평가할 수 있습니다.
  3. 자동 감시 창: 현재 컨텍스트의 변수에 자동으로 감시항목을 추가합니다.
  4. 출력 창: 콘솔에 쓰는 로깅 문 또는 코드의 출력을 표시합니다.

Visual Studio 디버깅 창 옵션의 스크린샷

변수 상태 보기 및 편집

프로그램 결함의 원인을 분석할 때는 변수 상태를 조사하여 예기치 않은 변경 내용을 확인할 수 있습니다. Visual Studio에는 다양한 디버깅 컨텍스트에서 변수의 상태를 모니터링하는 데 사용할 수 있는 여러 조사식 창 옵션이 있습니다.

  1. 조사식 창: 디버깅하는 동안 시간에 따라 선택한 변수 및 식을 추적할 수 있습니다.
  2. 지역 창: 현재 실행 범위 및 컨텍스트에 변수가 자동으로 표시됩니다.
  3. 자동 창: 현재 실행 중이거나 이전 줄에 사용된 변수를 자동으로 표시합니다.
  4. 직접 실행 창: 디버깅하는 동안 식과 변수를 라이브로 평가할 수 있습니다.

Visual Studio의 자동 창 스크린샷

또한 이중 대부분의 창을 사용하면 디버깅하는 동안 변수 값을 두 번 클릭하고 그 값을 변경할 수도 있습니다.

조사식 창은 코드를 실행하는 동안 변수를 추적하는 데 유용합니다. 편집기에서 변수를 마우스 오른쪽 단추로 클릭하고 감시할 추가를 선택할 수 있습니다. 이제 해당 변수가 조사식 창에 표시되며 앱이 실행될 때 자동으로 업데이트됩니다.

자동 또는 지역 창에서 변수를 마우스 오른쪽 단추로 클릭하여 시계를 추가할 수도 있습니다.

디버깅 중에 변수 정보를 보고 분석하는 또 다른 생산적인 방법은 DataTips를 사용하는 것입니다. 중단점에서 일시 중지된 경우 현재 범위에 있는 임의의 변수를 마우스로 가리킵니다. 변수 속성의 이름 및 현재 값을 보여주는 DataTip이 나타납니다. 편집기 창에서 함수 매개 변수나 변수를 직접 마우스로 가리켜 해당 값을 미리 볼 수도 있습니다.

호출 스택

프로그램에서 함수를 입력할 때마다 항목이 호출 스택에 추가됩니다. 애플리케이션이 복잡해지고 특정 함수가 다른 함수 내에서 여러 번 호출될 때 호출 스택은 그러한 호출의 내역을 나타냅니다.

예외의 원본을 찾는 데 유용합니다. 프로그램에서 예기치 않은 크래시가 발생하면 콘솔에 다음 예제와 같은 내용이 표시되는 경우가 많습니다.

Unhandled exception. System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at OrderProcessor.OrderQueue.ProcessNewOrders(String[] orderIds) in C:\Users\Repos\OrderProcessor\OrderQueue.cs:line 12
   at OrderProcessor.Program.Main(String[] args) in C:\Users\Repos\OrderProcessor\Program.cs:line 9

오류 메시지 아래에 있는 at [...] 줄 그룹을 스택 추적이라고 합니다. 스택 추적은 예외가 발생하며 종료되기 전에 호출된 모든 함수의 이름과 출처를 제공합니다. 그러나 .NET 런타임의 내부 함수도 포함되므로 해독하기 어려울 수 있습니다.

Visual Studio 호출 스택 창은 여기에서 편리합니다. 불필요한 정보가 필터링되어 기본적으로 사용자 고유의 코드에서 관련된 함수만 패널에 표시됩니다. 그런 다음 이 호출 스택을 해제하여 예외가 발생한 위치를 확인할 수 있습니다.

호출 스택 창의 스크린샷.

다음 단원에서는 디버거를 사용하여 이전에 본 피보나치 코드의 버그를 수정하는 연습을 안내합니다.

디버거 설정 지정

Visual Studio에서 디버거 동작에 대한 다양한 설정을 지정할 수 있습니다. 변수 표시 방법, 특정 경고 표시 여부, 중단점 설정 방법, 중단이 프로그램 실행에 미치는 영향 등을 포함합니다. 디버그 또는 릴리스 구성으로 빌드하도록 프로젝트를 구성할 수도 있습니다.

디버거 설정을 구성하려면 다양한 범주의 옵션을 제공하는 도구>옵션>디버깅 메뉴를 사용합니다. 가장 일반적인 옵션은 일반 범주에 있습니다.