Visual Studio에서 다중 스레드 애플리케이션 디버그
스레드는 운영 체제에서 프로세서 시간을 부여받는 명령 시퀀스입니다. 운영 체제에서 실행되는 모든 프로세스는 최소한 하나의 스레드로 구성됩니다. 프로세스에 스레드가 둘 이상인 경우를 다중 스레드라고 합니다.
다중 프로세서, 다중 코어 프로세서 또는 하이퍼스레딩 프로세스를 갖춘 컴퓨터는 몇 개의 동시 스레드를 실행할 수 있습니다. 많은 스레드를 사용하는 병렬 처리는 프로그램 성능을 크게 향상할 수 있지만 많은 스레드를 추적하기 때문에 디버깅을 더 어렵게 만들 수도 있습니다.
완벽한 병렬 처리가 항상 가능한 것은 아닙니다. 경우에 따라서는 스레드를 동기화해야 합니다. 한 스레드에서 다른 스레드의 결과를 기다리거나 한 스레드에 사용 중인 리소스를 다른 스레드에서 단독으로 액세스하여 사용해야 할 수도 있습니다. 주로 동기화 문제로 인해 다중 스레드 애플리케이션에서 버그가 발생합니다. 경우에 따라 스레드가 전혀 사용할 수 없는 리소스를 기다리다가 교착 상태가 발생할 수 있습니다.
스레드 및 프로세스
스레드 및 프로세스는 컴퓨터 분야에서 서로 연관된 개념입니다. 이 둘은 모두 특정 순서로 실행해야 할 명령 시퀀스를 나타냅니다. 그러나 개별 스레드 또는 프로세스의 명령은 함께 실행할 수 있습니다.
프로세스는 운영 체제에 있으며 사용자에게 프로그램이나 애플리케이션으로 표시됩니다. 반면에 스레드는 프로세스 내에 있습니다. 따라서 스레드를 간단한 프로세스라고도 합니다. 각 프로세스는 하나 이상의 스레드로 구성됩니다.
여러 개의 프로세스가 있으면 컴퓨터에서 한 번에 여러 작업을 수행할 수 있습니다. 여러 개의 스레드가 있으면 프로세스에서 작업을 구분하여 병렬로 수행할 수 있습니다. 프로세서가 여러 개 있는 컴퓨터에서는 프로세스나 스레드를 서로 다른 프로세서에서 실행하여 병렬 처리를 수행할 수 있습니다.
다중 스레드 앱을 디버깅 도구
Visual Studio는 다중 스레드 앱을 디버그하는 데 사용할 다양한 도구를 제공합니다.
스레드의 경우 스레드 디버깅을 위한 기본 도구는 스레드 창, 소스 창의 스레드 마커, 병렬 스택 창, 병렬 조사식 창, 디버그 위치 도구 모음입니다. 에 대해 자세히 알아보려면 합니다 스레드 창 및 디버그 위치 도구 모음에서 참조 연습: 스레드 창을 사용하여 디버그. 병렬 스택 및 병렬 조사식 창을 사용하는 방법을 알아보려면 다중 스레드 애플리케이션 디버깅 시작을 참조하세요. 두 항목 모두 스레드 마커를 사용하는 방법을 보여 줍니다.
TPL(작업 병렬 라이브러리)이나 동시성 런타임을 사용하는 코드의 경우 디버깅용 기본 도구는 병렬 스택 창, 병렬 조사식 창, 작업 창이며 이러한 도구는 JavaScript도 지원합니다. 시작하려면 연습: 병렬 애플리케이션 디버깅 및 연습: C++ AMP 애플리케이션 디버깅을 참조하세요.
GPU에서 스레드를 디버그하는 경우 기본 도구는 GPU 스레드 창입니다. 방법: GPU 스레드 창 사용을 참조하세요.
프로세스의 경우 기본 도구는 프로세스에 연결 대화 상자, 프로세스 창, 디버그 위치 도구 모음입니다.
Visual Studio에서 제공하는 강력한 중단점 및 추적점은 다중 스레드 애플리케이션을 디버그할 때 유용할 수 있습니다. 중단점 조건 및 필터를 사용하여 개별 스레드에 중단점을 배치합니다. 추적점을 통해 프로그램 실행을 중단 없이 추적하여 교착 상태와 같은 문제를 검토할 수 있습니다. 자세한 내용은 중단점 작업 및 추적점을 참조하세요.
사용자 인터페이스가 있는 다중 스레드 애플리케이션은 특히 디버깅하기 어려울 수 있습니다. 애플리케이션을 다른 컴퓨터에서 실행하면서 원격 디버깅을 사용하는 것이 좋습니다. 자세한 내용은 원격 디버깅을 참조하세요.
다음 표에서는 각 도구에 제공되는 정보와 각 도구에서 수행할 수 있는 작업을 보여 줍니다.
사용자 인터페이스 | 사용할 수 있는 정보 | 수행할 수 있는 작업 |
---|---|---|
프로세스에 연결 대화 상자 | 연결할 수 있는 사용 가능한 프로세스 - 프로세스 이름(.exe) - 프로세스 ID 번호 - 메뉴 모음 제목 - 형식(Managed v4.0; Managed v2.0, v1.1, v1.0; x86; x64; IA64) - 사용자 이름(계정 이름) - 세션 번호 |
연결할 프로세스 선택 원격 컴퓨터 선택 원격 컴퓨터 연결을 위한 전송 형식 변경 |
프로세스 창 | 연결된 프로세스 - 프로세스 이름 - 프로세스 ID 번호 - 프로세스 .exe 경로 - 메뉴 모음 제목 - 상태(중단. 실행 중) - 디버깅(네이티브, 관리 등) - 전송 종류(기본값, 네이티브, 인증 안 함) - 전송 한정자(원격 컴퓨터) |
도구 - 연결 - 분리 - 종료 바로 가기 메뉴 - 연결 - 분리 - 디버깅 중지 시 분리 - 종료 |
스레드 창 | 현재 프로세스의 스레드 - 스레드 ID - 관리 ID - 범주(주 스레드, 인터페이스 스레드, 원격 프로시저 호출 처리기 또는 작업자 스레드) - 스레드 이름 - 스레드가 생성되는 위치 - 우선 순위 - 선호도 마스크 - 일시 중단 횟수 - 프로세스 이름 - 플래그 표시기 - 일시 중단 표시기 |
도구 - 검색 - 호출 스택 검색 - 내 코드만 플래그 지정 - 사용자 지정 모듈 선택 영역 플래그 지정 - 그룹화 방법 - 열 - 호출 스택 확장/축소 - 그룹 확장/축소 - 스레드 중지/재개 바로 가기 메뉴 - 소스의 스레드 표시 - 스레드로 전환 - 실행 중인 스레드 중지 - 중지된 스레드 재개 - 추가 학습할 스레드에 플래그 지정 - 스레드 플래그 해제 - 스레드 이름 바꾸기 - 스레드 표시 및 숨기기 다른 작업 - DataTip에서 스레드의 호출 스택 보기 |
소스 창 | 왼쪽 여백의 스레드 표시기는 단일 또는 다중 스레드를 나타냅니다. 기본적으로 설정되어 있지 않으며 스레드 창의 바로 가기 메뉴를 사용하여 설정 | 바로 가기 메뉴 - 스레드로 전환 - 추가 학습할 스레드에 플래그 지정 - 스레드 플래그 해제 |
디버그 위치 도구 모음 | - 현재 프로세스 - 애플리케이션 일시 중단 - 애플리케이션 다시 시작 - 애플리케이션 일시 중단 및 종료 - 현재 스레드 - 현재 스레드 플래그 상태 전환 - 플래그가 지정된 스레드만 표시 - 현재 프로세스만 표시 - 현재 스택 프레임 |
- 다른 프로세스로 전환 - 애플리케이션 일시 중단, 다시 시작 및 종료 - 현재 프로세스의 다른 스레드로 전환 - 현재 스레드의 다른 스택 프레임으로 전환 - 현재 스레드 플래그 설정 또는 해제 - 플래그가 지정된 스레드만 표시 - 현재 프로세스만 표시 |
병렬 스택 창 | - 한 뷰에 표시되는 여러 스레드의 호출 스택입니다. - 각 스레드에 대한 활성 스택 프레임입니다. - 모든 메서드에 대한 호출자 및 호출 수신자입니다. - 교착 상태 검색 |
- 지정된 스레드 필터링 - 외부 코드 스택 필터링 - 작업 뷰로 전환 - 스레드 플래그 설정 또는 해제 - 확대/축소 - 스택 프레임 복사 - 모든 스택을 이미지로 저장/내보내기 |
병렬 조사식 창 | - 특히 주의할 스레드를 표시할 수 있는 플래그 열. - 화살표가 선택된 프레임을 나타내는 프레임 열. - 컴퓨터, 프로세스, 타일, 작업 및 스레드를 표시할 수 있는 구성 가능한 열. |
- 스레드 플래그 설정 또는 해제 - 플래그가 지정된 스레드만 표시 - 프레임 전환 - 열 정렬 - 스레드 그룹화 - 스레드 중지 또는 재개 - 병렬 조사식 창에서 데이터 내보내기 |
작업 창 | - 작업 ID, 작업 상태(예약됨, 실행 중, 대기 중, 교착 상태) 및 작업에 할당된 스레드를 포함한 Task 개체 정보를 표시합니다. - 호출 스택의 현재 위치입니다. - 생성 시간에 작업에 전달된 대리자 |
- 현재 작업으로 전환 - 작업 플래그 설정 또는 해제 - 작업 중지 또는 재개 |
GPU 스레드 창 | - 특히 주의할 스레드를 표시할 수 있는 플래그 열. - 현재 스레드 열 - 노란색 화살표는 현재 스레드를 나타냅니다. - 스레드 수 열 - 스레드 수를 동일한 위치에 표시합니다. - 줄 열 - 각 스레드 그룹이 위치한 코드 줄을 표시합니다. - 주소 열 - 각 스레드 그룹이 위치한 명령 주소를 표시합니다. - 위치 열: 주소 코드에서의 위치입니다. - 상태 열: 스레드가 활성화되어 있는지 아니면 차단되어 있는지를 표시합니다. - 타일 열 - 행의 스레드에 대한 타일 인덱스를 표시합니다. |
- 다른 스레드로 변경 - 특정 타일 및 스레드 표시 - 열 표시 또는 숨기기 - 열 기준 정렬 - 스레드 그룹화 - 스레드 중지 또는 재개 - 스레드 플래그 설정 또는 해제 - 플래그가 지정된 스레드만 표시 |