연습: 스레드 창을 사용하여 다중 스레드 앱 디버그(C#, Visual Basic, C++)

다중 스레드 앱을 디버그할 수 있는 여러 Visual Studio 사용자 인터페이스 요소가 있습니다. 이 문서에서는 코드 편집기 창의 다중 스레드 디버깅 기능인 디버그 위치 도구 모음과 스레드 창을 소개합니다. 다중 스레드 앱을 디버깅하는 다른 도구에 대한 자세한 내용은 다중 스레드 앱 디버깅 시작을 참조하세요.

이 자습서를 완료하는 데 몇 분밖에 걸리지 않으며, 다중 스레드 앱 디버깅의 기본 사항을 익힐 수 있습니다.

다중 스레드 앱 프로젝트 만들기

다음과 같이 이 자습서에서 사용할 다중 스레드 앱 프로젝트를 만듭니다.

  1. Visual Studio를 연 다음 새 프로젝트를 만듭니다.

    시작 창이 열려 있지 않으면 파일>시작 창을 선택합니다.

    시작 창에서 새 프로젝트를 선택합니다.

    시작 창에서 새 프로젝트 만들기를 선택합니다.

    새 프로젝트 만들기 창에서 검색 상자에 콘솔을 입력합니다. 다음으로, 언어 목록에서 C# 또는 C++를 선택한 다음, 플랫폼 목록에서 Windows를 선택합니다.

    언어 및 플랫폼 필터를 적용한 후 .NET Core, .NET 5+ 또는 C++용 콘솔 앱을 선택한 후, 다음을 선택합니다.

    참고 항목

    올바른 템플릿이 표시되지 않으면 도구>도구 및 기능 가져오기...로 이동합니다. 그러면 Visual Studio 설치 관리자가 열립니다. .NET 데스크톱 개발 또는 C++를 사용한 데스크톱 개발 워크로드를 선택한 다음, 수정을 선택합니다.

    새 프로젝트 구성 창에서 이름을 입력하거나 프로젝트 이름 상자의 기본 이름을 사용합니다. 그런 다음, 다음 또는 만들기 중 사용 가능한 옵션 하나를 선택합니다.

    .NET Core 또는 .NET 5+에서 권장되는 대상 프레임워크 또는 .NET 8을 선택한 후 만들기를 선택합니다.

    새 콘솔 프로젝트가 나타납니다. 프로젝트가 만들어지면 소스 파일이 나타납니다. 선택한 언어에 따라 소스 파일 이름이 Program.cs 또는 MyThreadWalkthroughApp.cpp일 수 있습니다.

  2. 소스 파일의 코드를 다중 스레드 앱 디버깅 시작의 C# 또는 C++ 예제 코드로 바꿉니다.

  3. 파일>모두 저장을 선택합니다.

디버그 시작

  1. 소스 코드에서 다음 줄을 찾습니다.

    Thread.Sleep(3000);
    Console.WriteLine();
    
  2. 왼쪽 여백을 클릭하거나 줄을 선택하고 F9 키를 눌러 Console.WriteLine(); 줄에 중단점을 설정합니다.

    중단점은 코드 줄의 왼쪽 여백에 빨간색 원으로 표시됩니다.

  3. 디버그>디버깅 시작을 선택하거나 F5 키를 누릅니다.

    앱이 디버그 모드에서 시작되고, 중단점에서 일시 중지됩니다.

  4. 중단 모드에 있는 동안 디버그>Windows>스레드를 선택하여 스레드 창을 엽니다. 스레드 및 기타 디버깅 창을 열거나 보려면 디버깅 세션에 있어야 합니다.

스레드 마커 검사

  1. 소스 코드에서 Console.WriteLine(); 줄을 찾습니다.

    1. 스레드 창을 마우스 오른쪽 단추로 클릭하고, 메뉴에서 소스의 스레드 표시Show Threads in Source를 선택합니다.

    이제 소스 코드 줄 옆의 여백에 스레드 마커 아이콘 Thread Marker이 표시됩니다. 스레드 마커는 이 위치에서 스레드가 중지되었음을 나타냅니다. 이 위치에 중지된 스레드가 여러 개 있으면 multiple threads 아이콘이 표시됩니다.

  2. 스레드 마커에 포인터를 올려 놓습니다. 중지된 스레드의 이름과 스레드 ID 번호를 알려주는 DataTip이 나타납니다. 스레드 이름이 <No Name>일 수 있습니다.

    스레드 창에서 이름을 변경하면 이름 없는 스레드를 식별하는 데 도움이 됩니다. 스레드를 마우스 오른쪽 단추로 클릭하고 이름 바꾸기를 선택합니다.

  3. 소스 코드의 스레드 마커를 마우스 오른쪽 단추로 클릭하면 바로 가기 메뉴에서 사용 가능한 옵션이 표시됩니다.

스레드에 플래그 지정 및 스레드의 플래그 해제

특별히 지켜보려는 스레드에 플래그를 지정하여 추적할 수 있습니다.

소스 코드 편집기 또는 스레드 창에서 스레드에 플래그를 지정하거나 플래그를 해제합니다. 디버그 위치 또는 스레드 창 도구 모음에서 플래그가 지정된 스레드만 표시할 것인지 아니면 모든 스레드를 표시할 것인지 선택합니다. 어느 위치에서 선택하든, 선택한 항목은 모든 위치에 영향을 줍니다.

소스 코드의 스레드에 플래그 지정 및 플래그 해제

  1. 보기>도구 모음>디버그 위치를 선택하여 디버그 위치 도구 모음을 엽니다. 도구 모음 영역을 마우스 오른쪽 단추를 클릭하고 디버그 위치를 선택할 수도 있습니다.

  2. 디버그 위치 도구 모음에는 프로세스, 스레드스택 프레임의 세 가지 필드가 있습니다. 스레드 목록을 드롭다운하고, 스레드가 몇 개나 있는지 확인합니다. 스레드 목록에서 현재 실행 중인 스레드는 > 기호로 표시됩니다.

  3. 소스 코드 창에서 여백의 스레드 마커 아이콘 위로 마우스를 이동하고, DataTip에서 플래그 아이콘(또는 빈 플래그 아이콘 중 하나)을 선택합니다. 플래그 아이콘이 빨간색으로 바뀝니다.

    스레드 마커 아이콘을 마우스 오른쪽 단추로 클릭하고 플래그를 가리킨 다음, 바로 가기 메뉴에서 플래그를 지정할 스레드를 선택할 수도 있습니다.

  4. 디버그 위치 도구 모음에서 스레드 필드의 오른쪽에 있는 플래그가 지정된 스레드만 표시 아이콘 Show Flagged Threads을 선택합니다. 플래그가 지정된 스레드가 하나도 없으면 이 아이콘이 회색으로 표시됩니다.

    이제 도구 모음의 스레드 드롭다운에는 플래그가 지정된 스레드만 표시됩니다. 다시 모든 스레드를 표시하려면 플래그가 지정된 스레드만 표시 아이콘을 다시 선택합니다.

    일부 스레드에 플래그를 지정한 후에는 커서를 코드 편집기에 두고 마우스 오른쪽 단추를 클릭한 다음, 플래그 지정된 스레드를 커서까지 실행을 선택할 수 있습니다. 플래그가 지정된 모든 스레드가 도달할 코드를 선택해야 합니다. 플래그 지정된 스레드를 커서까지 실행은 선택한 코드 줄에서 스레드를 일시 중지하므로, 스레드를 중지 및 재개하여 실행 순서를 쉽게 제어할 수 있습니다.

  5. 현재 실행 중인 스레드의 플래그가 지정된 상태 또는 플래그가 지정되지 않은 상태를 전환하려면 플래그가 지정된 스레드만 표시 단추의 왼쪽에서 단일 플래그 현재 스레드 플래그 지정 상태 표시/숨기기 단추를 선택합니다. 현재 스레드에 플래그를 지정하면 플래그가 지정된 스레드만 표시할 때 현재 스레드를 찾는 데 유용합니다.

  6. 스레드의 플래그를 해제하려면 소스 코드에서 스레드 마커를 마우스로 가리키고 빨간색 플래그 아이콘을 선택하여 플래그를 제거하거나, 스레드 마커를 마우스 오른쪽 단추로 클릭하고 플래그 해제를 선택합니다.

스레드 창에서 스레드에 플래그 지정 및 플래그 해제

스레드 창에서 플래그가 지정된 스레드의 옆에는 빨간색 플래그 아이콘이 있지만, 플래그가 지정되지 않은 스레드(표시되는 경우)의 옆에는 빈 윤곽선 아이콘이 있습니다.

Threads Window

현재 상태에 따라 플래그 아이콘을 선택하고 스레드 상태를 플래그가 지정된 상태 또는 플래그가 지정되지 않은 상태로 변경합니다.

줄을 마우스 오른쪽 단추로 클릭하고 바로 가기 메뉴에서 플래그 지정, 플래그 해제 또는 모든 스레드 플래그 해제를 선택할 수도 있습니다.

스레드 창 도구 모음에는 플래그가 지정된 스레드만 표시 단추도 있습니다. 이 단추는 두 플래그 아이콘의 오른쪽에 있습니다. 이 단추는 디버그 위치 도구 모음에 있는 단추와 동일하게 작동하며, 두 단추 모두 두 위치에 표시되는 항목을 제거합니다.

기타 스레드 창 기능

스레드 창에서 원하는 열 헤더를 선택하여 해당 열을 기준으로 스레드를 정렬할 수 있습니다. 열을 다시 선택하면 정렬 순서가 반대로 바뀝니다. 모든 스레드가 표시되는 경우 플래그 아이콘 열을 선택하면 플래그가 지정된 상태 또는 플래그가 지정되지 않은 상태를 기준으로 스레드가 정렬됩니다.

스레드 창의 두 번째 열(헤더 없음)은 현재 스레드 열입니다. 이 열의 노란색 화살표는 현재 실행 지점을 나타냅니다.

위치 열은 소스 코드에서 각 스레드가 표시되는 위치를 보여줍니다. 위치 항목 옆에 있는 확장 화살표를 선택하거나 항목 위로 마우스를 이동하면 해당 스레드의 부분 호출 스택이 표시됩니다.

스레드의 호출 스택을 그래픽으로 보려면 병렬 스택 창을 사용합니다. 이 창을 열려면 디버깅 중에 디버그>Windows>병렬 스택을 선택합니다.

플래그 지정, 플래그 해제모든 스레드 플래그 해제 외에도 스레드 창 항목의 오른쪽 클릭 바로 가기 메뉴로 다음과 같은 기능이 제공됩니다.

  • 소스의 스레드 표시 단추.
  • 16진수 표시. 스레드 창의 스레드 ID를 10진수에서 16진수 형식으로 변경합니다.
  • 스레드로 전환. 실행을 즉시 해당 스레드로 전환합니다.
  • 이름 바꾸기. 스레드 이름을 변경할 수 있습니다.
  • 중지 및 재개 명령.

스레드 실행 중지 및 재개

스레드를 중지 및 재개(또는 일시 중단 및 다시 시작)하여 스레드가 작업을 수행하는 순서를 제어할 수 있습니다. 스레드 중지 및 재개 기능을 사용하여 교착 상태 및 경합 상태와 같은 동시성 문제를 해결할 수 있습니다.

다른 스레드를 중지하지 않고 단일 스레드를 팔로우하려면(일반적인 디버깅 시나리오에 해당) 다중 스레드 애플리케이션 디버깅 시작을 참조하세요.

스레드를 중지 및 해제하려면:

  1. 스레드 창에서 아무 스레드를 마우스 오른쪽 단추로 클릭하고 중지를 선택합니다. 현재 스레드 열에 일시 중지 아이콘이 있으면 스레드가 중지되었다는 뜻입니다.

  2. 스레드 창 도구 모음에서 을 선택한 다음, 일시 중단 횟수를 선택하여 일시 중단 횟수 열을 표시합니다. 중지된 스레드의 일시 중단 횟수 값은 1입니다.

  3. 중지된 스레드를 마우스 오른쪽 단추로 클릭하고 재개를 선택합니다.

    일시 중지 아이콘이 사라지고, 일시 중단 횟수 값이 0으로 변경됩니다.

다른 스레드로 전환

다른 스레드로 전환하려고 할 때 애플리케이션이 중단 모드에 있습니다 창이 표시되는 경우가 있습니다. 이 창은 현재 디버거가 표시할 수 있는 코드가 스레드에 없음을 알려줍니다. 관리 코드를 디버깅할 수 있지만 스레드가 네이티브 코드인 경우를 예로 들 수 있습니다. 이 창은 문제를 해결하기 위한 제안 사항을 제공합니다.

다른 스레드로 전환하는 방법:

  1. 스레드 창에서 현재 스레드 ID(현재 스레드 열에 노란색 화살표가 있는 스레드)를 기록해 둡니다. 앱을 계속 진행하려면 이 스레드로 다시 전환해야 합니다.

  2. 다른 스레드를 마우스 오른쪽 단추로 클릭하고 바로 가기 메뉴에서 스레드로 전환을 선택합니다.

  3. 스레드 창에서 노란색 화살표 위치가 변하는 것을 볼 수 있습니다. 원래 현재 스레드 마커 역시 윤곽선으로 남아 있습니다.

    코드 소스 편집기의 스레드 마커에 표시되는 도구 설명과 디버그 위치 도구 모음의 스레드 드롭다운에 표시되는 목록을 살펴봅니다. 현재 스레드 역시 변경된 것을 확인할 수 있습니다.

  4. 디버그 위치 도구 모음의 스레드 목록에서 다른 스레드를 선택합니다. 다른 두 위치에서도 현재 스레드가 변경됩니다.

  5. 소스 코드 편집기에서 스레드 마커를 마우스 오른쪽 단추로 클릭하고 스레드로 전환을 가리킨 다음, 목록에서 다른 스레드를 선택합니다. 세 위치 모두에서 현재 스레드가 변경되는 것을 볼 수 있습니다.

소스 코드에서 스레드 마커를 사용하면 해당 위치에서 중지된 스레드로만 전환할 수 있습니다. 스레드 창 및 디버그 위치 도구 모음을 사용하면 임의의 스레드로 전환할 수 있습니다.

다중 스레드 앱 디버깅의 기본을 알아보았습니다. 스레드 창, 디버그 위치 도구 모음의 스레드 목록 또는 소스 코드 편집기의 스레드 마커를 사용하여 스레드를 관찰하고, 스레드에 플래그를 지정 및 해제하고, 스레드를 중지 및 재개할 수 있습니다.