|
스레드 및 프로세스 작업은 디버깅의 중요한 부분입니다. Visual Studio에서는 디버깅하려는 실행 프로세스에 연결하고, 연결된 프로세스와 해당 프로세스 내에서 실행되는 스레드에 대한 정보를 보고, 디버깅하려는 스레드와 프로세스의 실행을 제어하기 위한 인터페이스를 제공합니다.
스레드와 프로세스
--------------------------
스레드와 프로세스는 컴퓨터 분야에서 서로 연관된 개념입니다. 이 둘은 모두 특정 순서로 실행해야 할 명령 시퀀스를 나타냅니다. 그러나 개별 스레드 또는 프로세스의 명령은 함께 실행할 수 있습니다.
프로세스는 운영 체제에 있으며 사용자에게 프로그램이나 응용 프로그램으로 표시됩니다. 반면에 스레드는 프로세스 내에 있습니다. 따라서 스레드를 간단한 프로세스라고도 합니다. 각 프로세스는 하나 이상의 스레드로 구성됩니다.
여러 개의 프로세스가 있으면 컴퓨터에서 한 번에 여러 작업을 수행할 수 있습니다. 여러 개의 스레드가 있으면 프로세스에서 작업을 구분하여 병렬로 수행할 수 있습니다. 프로세서가 여러 개 있는 컴퓨터에서는 프로세스나 스레드를 서로 다른 프로세서에서 실행하여 병렬 처리를 수행할 수 있습니다.
완벽한 병렬 처리가 항상 가능한 것은 아닙니다. 경우에 따라서는 스레드를 동기화해야 합니다. 한 스레드에서 다른 스레드의 결과를 기다리거나 한 스레드에 사용 중인 리소스를 다른 스레드에서 단독으로 액세스하여 사용해야 할 수도 있습니다. 주로 동기화 문제로 인해 다중 스레드 응용 프로그램에서 버그가 발생합니다. 경우에 따라 스레드가 전혀 사용할 수 없는 리소스를 기다리다가 교착 상태가 발생할 수 있습니다.
Visual Studio 디버거에서는 스레드 및 프로세스 디버깅에 사용할 수 있는 강력하고 간편한 도구를 제공합니다.
Visual Studio의 스레드 및 프로세스 디버깅 도구
-------------------------------------------------------------
Visual Studio에서 프로세스 작업을 수행하기 위한 기본 도구는 프로세스에 연결 대화 상자, 프로세스 창 및 디버그 위치 도구 모음입니다. 스레드 디버깅을 위한 기본 도구는 스레드 창, 소스 창의 스레드 마커 및 디버그 위치 도구 모음입니다.
다중 스레드 응용 프로그램 디버깅을 위한 기본 도구는 병렬 스택 창과 병렬 작업 창입니다.
다음 표에서는 각 도구에 제공되는 정보와 각 도구에서 수행할 수 있는 작업을 보여 줍니다.
사용자 인터페이스 | 사용할 수 있는 정보 | 수행할 수 있는 작업 |
프로세스에 연결 대화 상자 |
연결할 수 있는 사용 가능한 프로세스
|
연결할 프로세스 선택
원격 컴퓨터 선택
원격 컴퓨터 연결을 위한 전송 형식 변경 |
프로세스 창 |
연결된 프로세스
|
도구
바로 가기 메뉴
|
스레드 창 |
현재 프로세스의 스레드
|
도구
바로 가기 메뉴
다른 작업
|
소스 창 | 왼쪽 여백의 스레드 표시기는 단일 또는 다중 스레드를 나타냅니다. 기본적으로 설정되어 있지 않으며 스레드 창의 바로 가기 메뉴를 사용하여 설정합니다. |
바로 가기 메뉴
|
디버그 위치 도구 모음 |
|
다른 프로세스로 전환
|
병렬 스택 창 |
|
|
병렬 작업 창 |
|
|
실행 중인 프로세스에 연결
--------------------------------
Visual Studio 디버거는 Visual Studio 외부에서 실행되고 있는 프로세스에 연결할 수 있습니다. 이 연결 기능은 다음과 같은 경우에 사용할 수 있습니다.
Visual Studio에서 만들지 않은 응용 프로그램을 디버깅하는 경우
여러 프로세스를 동시에 디버깅하는 경우. 단일 솔루션 내에서 여러 프로젝트를 시작하여 여러 프로세스를 디버깅할 수도 있습니다.
원격 컴퓨터에서 실행되고 있는 프로세스를 디버깅하는 경우
Visual Studio에서 시작하기가 어려운 별도의 프로세스에서 실행되는 DLL을 디버깅하는 경우(예: 인터넷 정보 서비스에서 실행되는 서비스나 ISAPI DLL)
Visual Studio의 외부에서 실행하는 동안 프로세스가 충돌할 때 자동으로 디버거를 시작하는 경우 (Just-In-Time 디버깅)
일단 프로그램에 연결되면 디버거 실행 명령을 사용하고 프로그램 상태를 검사하는 등의 작업을 수행할 수 있습니다. 자세한 내용은 실행 제어 및 디버거에서 데이터 보기를 참조하십시오. 디버그 정보를 사용하여 프로그램을 빌드하였는지 여부, 프로그램 코드에 액세스할 수 있는지 여부 및 공용 언어 런타임 JIT 컴파일러가 디버그 정보를 추적하고 있는지 여부에 따라 프로그램 검사 기능이 제한될 수 있습니다.
방법: 실행 중인 프로세스에 연결
실행 중인 임의의 프로세스에 Visual Studio 디버거를 연결할 수 있습니다.
실행 중인 프로세스에 연결하려면
1. 디버그 메뉴에서 프로세스에 연결을 선택합니다. 열려 있는 프로젝트가 없으면 도구 메뉴에서 프로세스에 연결을 선택합니다.
2. 프로세스에 연결 대화 상자의 사용 가능한 프로세스 목록에서 연결할 프로그램을 찾습니다.
3.연결 대상 상자에서 디버깅할 코드 형식이 표시되어 있는지 확인합니다. 기본 자동 설정은 디버깅할 코드 형식을 결정합니다. 자동 설정이 알맞지 않은 경우 다음을 수행합니다.
4.연결을 클릭합니다.
사용 가능한 프로세스 목록은 프로세스 대화 상자를 열 때 자동으로 표시됩니다. 대화 상자가 열려 있는 동안 백그라운드에서 프로세스를 시작하고 중지할 수 있습니다. 그러나 내용이 현재 상태가 아닐 수 있습니다. 언제든지 새로 고침을 클릭하여 목록을 새로 고치고 현재 프로세스 목록을 확인할 수 있습니다.
디버깅하는 동안 여러 프로그램에 연결할 수 있지만 언제든지 디버거에서 활성화되는 프로그램은 한 개뿐입니다. 디버그 위치 도구 모음이나 프로세스 창에서 활성 프로그램을 설정할 수 있습니다. 자세한 내용은 방법: 현재 프로세스 설정을 참조하십시오.
활성 프로그램에는 모든 디버그 메뉴 실행 명령이 적용됩니다. 프로세스 대화 상자에서 디버깅된 프로그램을 중단하거나 디버그 메뉴에 연결된 모든 프로그램을 중단할 수 있습니다. 자세한 내용은 방법: 실행 중단를 참조하십시오.
참고
디버거에서 Visual C++로 작성된 관리 코드에 연결하려면 코드에서 DebuggableAttribute를 내보내야 합니다. 이 특성은 /ASSEMBLYDEBUG 링커 옵션으로 링크하여 자동으로 코드에 추가할 수 있습니다.
신뢰할 수 없는 사용자 계정에서 소유한 프로세스에 연결하면 보안 경고 확인 대화 상자가 나타납니다.
원격 데스크톱(터미널 서비스) 세션에서 디버깅할 때 사용 가능한 프로세스 목록에 사용 가능한 프로세스 중 일부가 표시되지 않는 경우가 있습니다. Windows Server 2003 이상 버전에서 사용자 계정이 제한된 사용자로 Visual Studio를 실행하는 경우 서비스 및 w3wp.exe를 비롯한 다른 서버 프로세스에 사용되는 세션 0에서 실행되는 프로세스는 사용 가능한 프로세스 목록에 표시되지 않습니다. 관리자 계정으로 Visual Studio를 실행하거나 터미널 서비스 세션 대신 서버 콘솔에서 Visual Studio를 실행하여 이 문제를 해결할 수 있습니다. 이 두 가지 해결 방법을 모두 사용할 수 없으면 세 번째 방법으로 Windows 명령줄에서 vsjitdebugger.exe -p ProcessId를 실행하여 프로세스에 연결합니다. 프로세스 ID는 tlist.exe를 사용하여 확인할 수 있습니다. tlist.exe를 구하려면 http://go.microsoft.com/fwlink/?LinkId=168279에서 Debugging Tools for Windows를 다운로드하여 설치합니다.
5. 언제든지 프로세스에 연결 대화 상자에서 사용 가능한 프로세스 목록을 새로 고쳐서 프로세스의 현재 목록을 볼 수 있습니다.
방법: 현재 프로세스 설정
디버깅하는 동안 여러 프로세스에 연결할 수 있지만 한 번에 프로세스 하나만 디버거에서 활성화됩니다. 활성 프로세스는 디버그 위치 도구 모음에서 설정할 수 있습니다.
활성 프로세스를 설정하려면
— 또는 —
디버그 위치 도구 모음에서 프로세스 목록 상자를 선택한 다음 현재 프로세스로 만들 프로세스를 선택합니다.
방법: 원격 컴퓨터 선택
프로세스에 연결 대화 상자를 사용할 때 원격 디버깅용으로 설정된 다른 컴퓨터를 선택할 수 있습니다. 자세한 내용은 방법: 원격 디버깅 설정를 참조하십시오. 원격 컴퓨터를 선택하면 해당 컴퓨터에서 실행되는 사용 가능한 프로세스의 목록을 볼 수 있고 디버깅을 위해 하나 이상의 프로세스에 연결할 수 있습니다.
원격 컴퓨터를 선택하려면
방법: 연결 오류 처리
실행 중인 프로세스에 Visual Studio 디버거를 연결할 때 이 프로세스에는 한 가지 이상의 코드 형식이 포함될 수 있습니다. 디버거를 연결할 수 있는 코드 형식은 네이티브, 관리, T-SQL 및 스크립트 형식입니다. 이러한 코드 형식은 프로세스에 연결 대화 상자에 표시 및 선택됩니다.
참고
디버거에서 C++로 작성된 관리 코드에 연결하려면 코드에서 DebuggableAttribute를 내보내야 합니다. 이 특성은 /ASSEMBLYDEBUG 링커 옵션으로 링크하여 자동으로 코드에 추가할 수 있습니다.
때로는 디버거가 한 코드 형식에는 연결되고 다른 코드 형식에는 연결되지 않을 수도 있습니다. 이러한 문제는 원격 컴퓨터에서 실행 중인 프로세스에 연결하려 할 때 발생할 수 있습니다. 원격 컴퓨터에 설치된 원격 디버깅 구성 요소가 일부 코드 형식만 지원하고 다른 코드 형식은 지원하지 않을 수도 있습니다. 데이터베이스를 직접 디버깅하기 위해 두 개 이상의 프로세스에 연결하려는 경우에도 이 문제가 발생할 수 있습니다. SQL 디버깅은 단일 프로세스에 대한 연결만 지원합니다.
디버거를 일부 코드 형식에 연결할 수 있지만 모든 코드 형식에 연결할 수는 없는 경우 연결할 수 없는 형식을 알려 주는 메시지가 나타납니다.
적어도 하나의 코드 형식에 디버거가 성공적으로 연결되면 프로세스 디버깅을 진행할 수 있습니다. 이 경우 성공적으로 연결된 코드 형식만 디버깅할 수 있습니다. 위 예제 메시지에서는 스크립트 코드 형식에 연결하지 못했음을 보여 줍니다. 따라서 이 프로세스 내의 스크립트 코드는 디버깅할 수 없습니다. 스크립트 코드는 프로세스 내에서 계속 실행되지만 스크립트에서 중단점을 설정하거나 데이터를 보거나 기타 디버깅 작업을 수행할 수는 없습니다.
디버거가 연결되지 않는 특정 코드 형식에만 다시 연결을 시도하면 해당 코드 형식에 디버거가 연결되지 않는 이유를 더 구체적으로 확인할 수 있습니다.
코드 형식에 연결하지 못한 이유에 대한 자세한 정보를 얻으려면
1. 프로세스에서 분리합니다. 이렇게 하려면 디버그 메뉴에서 모두 분리를 클릭합니다.
2. 한 프로그램 종류만 선택하여 프로세스에 다시 연결합니다.
이렇게 하면 연결이 완전히 실패하고 자세한 오류 메시지가 나타납니다.
방법: 모든 프로세스 분리
프로그램을 분리하면 디버거에 연결했거나 디버거에서 시작한 프로그램에서 디버거를 분리할 수 있습니다.
모든 프로그램에서 동시에 분리하려면
방법: 프로세스 창 사용
------------------------------
프로세스 창에는 Visual Studio에 연결했거나 Visual Studio에서 시작한 프로세스가 모두 표시됩니다. 자세한 내용은 실행 중인 프로세스에 연결를 참조하십시오.
프로세스 창에서 임의의 연결된 프로세스를 선택하여 현재 프로세스로 설정하고 디버깅할 수 있습니다. 자세한 내용은 방법: 현재 프로세스 설정를 참조하십시오.
또한 프로세스 창을 사용하여 프로세스를 종료하거나 분리할 수 있습니다.
프로세스를 나누거나 중단 상태에 있는 현재 프로세스의 실행을 계속합니다.
중단 모드나 실행 모드에서 프로세스 창을 표시하려면
방법: 프로세스 종료
프로세스 창에서 다음과 같은 절차에 따라 연결된 프로세스를 종료할 수 있습니다.
연결된 프로세스의 디버깅을 중지하고 프로세스가 계속 실행되도록 유지하려면 프로세스 분리를 대신 사용합니다.
연결된 프로세스를 종료하려면
연결된 프로세스를 모두 종료하려면
방법: 프로세스 중단 또는 계속
프로세스 창에서, 첨부된 프로세스의 실행을 중단할 수 있습니다. 또한 계속 실행을 중단하거나 중단 모드에서 현재 프로세스의 실행을 재개할 수 있습니다.
이러한 작업은 모든 프로세서 중단점이 비활성화 되었을 때 기본적으로 하나의 프로세스 중단점이 가능한 경우에 한 작업에만 사용할 수 있습니다.
프로세스를 계속하려면
개별 프로세스의 중단과 실행을 하려면
다중 스레드 응용 프로그램 디버깅
------------------------------
스레드는 운영 체제에서 프로세서 시간을 할당받는 명령 시퀀스입니다. 운영 체제에서 실행되는 모든 프로세스는 최소한 하나의 스레드로 구성됩니다. 프로세스에 스레드가 둘 이상인 경우를 다중 스레드라고 합니다.
다중 프로세서, 다중 코어 프로세서 또는 하이퍼스레드 프로세스를 갖춘 컴퓨터는 여러 스레드를 동시에 실행할 수 있습니다. 여러 스레드를 병렬 처리하면 프로그램 성능이 크게 향상되지만, 여러 스레드를 추적해야 하므로 디버깅이 어려워질 수도 있습니다.
또한 다중 스레드로 인해 새로운 종류의 버그가 생길 수 있습니다. 예를 들어 둘 이상의 스레드에서 같은 리소스에 액세스해야 하지만 한 번에 스레드 중 하나만 리소스에 안전하게 액세스할 수 있는 경우가 많습니다. 한 번에 한 스레드만 리소스에 액세스할 수 있게 하려면 특정한 형태의 상호 제외가 필요합니다. 상호 제외가 잘못 수행되면 어떠한 스레드도 실행될 수 없는 교착 상태 조건이 발생할 수 있습니다. 교착 상태 문제는 특히 디버깅하기 어려울 수 있습니다.
방법: 스레드 창 사용
스레드 창에서 디버깅 중인 응용 프로그램의 스레드를 검사하고 작업할 수 있습니다.
스레드 창에는 각 행이 응용 프로그램의 스레드를 나타내는 테이블이 있습니다. 기본적으로 이 테이블에는 응용 프로그램의 모든 스레드가 나열되지만 목록을 필터링하여 관심 있는 스레드만 표시할 수 있습니다. 열마다 다른 유형의 정보가 있습니다. 일부 열을 숨길 수도 있습니다. 모든 열을 표시하면 왼쪽부터 다음 정보가 나타납니다.
중단 모드나 실행 모드에서 스레드 창을 표시하려면
열을 표시하거나 숨기려면
활성 스레드를 전환하려면 다음 단계 중 하나를 수행합니다.
스레드 그룹화 및 정렬
스레드를 그룹화하면 테이블에 각 그룹의 제목이 나타납니다. 제목에는 "작업자 스레드" 또는 "플래그가 해제된 스레드" 등의 그룹 설명과 트리 컨트롤이 포함됩니다. 각 그룹의 멤버 스레드가 그룹 제목 아래에 나타납니다. 그룹에 대한 멤버 스레드를 숨기려면 트리 컨트롤을 사용하여 그룹을 축소합니다.
그룹화가 정렬보다 우선하기 때문에 예를 들어 스레드를 범주별로 그룹화한 다음 각 범주 내의 ID로 정렬할 수 있습니다.
스레드를 정렬하려면
스레드를 그룹화하려면
그룹 내에서 스레드를 정렬하려면
모든 그룹을 확장하거나 축소하려면
특정 스레드 검색
Visual Studio 2010에서 지정된 문자열과 일치하는 스레드를 검색할 수 있습니다. 스레드 창에서 스레드를 검색하면 창의 열에 검색 문자열과 일치하는 모든 스레드가 표시됩니다. 이 정보에는 위치 열의 호출 스택 맨 위에 나타나는 스레드 위치가 포함됩니다. 그러나 기본적으로 전체 호출 스택이 검색되지는 않습니다.
특정 스레드를 검색하려면
-또는-
스레드 중지 및 재개
스레드를 중지하면 리소스를 사용할 수 있어도 스레드 실행이 시작되지 않습니다.
네이티브 코드에서는 Windows 함수 SuspendThread와 ResumeThread 또는 MFC 함수 CWinThread::SuspendThread와 CWinThread::ResumeThread를 호출하여 스레드를 일시 중단하거나 다시 시작할 수 있습니다. SuspendThread나 ResumeThread를 호출하는 경우 스레드 창에 나타나는 일시 중단 횟수를 변경할 수 있습니다. 그러나 네이티브 스레드를 중지하거나 재개하는 경우에는 일시 중단된 횟수를 변경하지 않습니다. 네이티브 코드에서는 스레드가 재개되고 일시 중단된 횟수가 0인 경우 이외에는 스레드를 실행할 수 없습니다.
관리 코드에서는 스레드를 중지하거나 재개하면 일시 중단된 횟수가 변경됩니다. 관리 코드에서는 중지된 스레드의 일시 중단된 횟수가 1입니다. 네이티브 코드에서 중지된 스레드의 일시 중단된 횟수는 0입니다. 단, SuspendThread 호출로 인해 스레드가 일시 중단된 경우는 예외입니다.
참고
네이티브 코드에서 관리 코드로의 호출을 디버깅할 때 관리 코드는 이를 호출한 네이티브 코드와 동일한 실제 스레드에서 실행됩니다. 네이티브 스레드를 일시 중단하거나 중지하면 관리 코드도 중지됩니다.
스레드 실행을 중지하거나 재개하려면
스레드 호출 스택 표시 및 프레임 간 전환
다중 스레드 프로그램에서 각 스레드에는 자신의 고유한 호출 스택이 있습니다. 스레드 창을 사용하여 편리하게 이러한 스택을 볼 수 있습니다.
스레드의 호출 스택을 보려면
모든 스레드의 호출 스택을 보거나 축소하려면
방법: 디버깅 중 다른 스레드로 전환
다중 스레드 응용 프로그램을 디버깅하는 경우 작업 중인 스레드에서 다른 스레드로 컨텍스트를 전환하는 여러 가지 방법 중 하나를 사용할 수 있습니다.
스레드 창에 나타나는 스레드로 전환하려면
소스 창에서 스레드를 전환하려면
디버그 위치 도구 모음에서 스레드로 전환하려면
방법: 스레드에 플래그 지정 및 스레드의 플래그 해제
스레드 창에서 아이콘으로 스레드를 표시하여 특별한 주의가 필요한 스레드에 플래그를 설정할 수 있습니다. 이 아이콘은 플래그 설정된 스레드를 다른 스레드와 구분하는 데 도움이 됩니다.
또한 플래그가 지정된 스레드는 디버그 위치 도구 모음의 스레드 목록에서 별도로 처리됩니다. 이 목록에 모든 스레드나 플래그 설정된 스레드만 표시할 수 있습니다. 스레드에 플래그를 설정하면 스레드 목록이 플래그 설정된 스레드만 표시하도록 자동으로 전환되지만 모든 스레드를 적절히 표시하도록 목록을 다시 전환할 수도 있습니다.
스레드 창을 사용하여 스레드에 플래그를 설정하거나 해제하려면
모든 스레드의 플래그를 해제하려면
내 코드만 플래그를 설정하려면
선택한 모듈과 연결된 스레드에 플래그를 설정하려면
방법: 네이티브 코드에 스레드 이름 설정
프로그램의 스레드 이름을 설정하려면 다음 코드 예제와 같이 SetThreadName 함수를 사용합니다.
// #pragma pack(push,8) void SetThreadName( DWORD dwThreadID, char* threadName) __try |
방법: 관리 코드에 스레드 이름 설정
스레드 명명 기능은 Visual Studio의 모든 버전에서 사용할 수 있습니다. 이 기능은 스레드 창에서 스레드를 추적할 때 유용합니다. Visual Studio Express 버전에서는 스레드 창을 사용할 수 없으므로 Express 버전에서는 스레드 명명이 유용하지 않습니다.
관리 코드에 스레드 이름을 설정하려면 [System.Threading.Thread.Name] 속성을 사용합니다.
Public Class Needle Sub Main() |
연습: 다중 스레드 응용 프로그램 디버깅
Visual Studio 2010은 다중 스레드 응용 프로그램을 쉽게 디버깅할 수 있도록 향상된 스레드 창과 그 밖의 향상된 사용자 인터페이스를 제공합니다. 이 연습은 몇 분 정도 소요되지만 연습을 완료하면 다중 스레드 응용 프로그램 디버깅을 위한 새로운 인터페이스 기능에 익숙해질 수 있습니다.
이 연습을 시작하려면 다중 스레드 응용 프로그램 프로젝트가 필요합니다. 여기에 나열된 단계에 따라 프로젝트를 만드십시오.
1. 연습 프로젝트를 만들려면
public class ServerClass // Pause for a moment to provide a delay to make public static void StaticMethod() // Pause for a moment to provide a delay to make public class Simple ServerClass serverObject = new ServerClass(); // Create the thread object, passing in the // Start the thread. Console.WriteLine("The Main() thread calls this after " // Create the thread object, passing in the // Start the thread. Console.WriteLine("The Main() thread calls this after " |
연습을 시작하려면
Thread.Sleep(3000);
Console.WriteLine();
디버깅을 시작하려면
스레드 마커를 찾으려면
Visual Studio 2008에서는 특히 주의할 스레드에 플래그를 지정할 수 있습니다. 스레드에 플래그를 지정하면 중요한 스레드를 추적하고 중요하지 않은 스레드는 무시할 수 있습니다.
스레드에 플래그를 지정하려면
스레드의 플래그를 해제하려면
3. 스레드 창에 대한 추가 정보
스레드 창에 대해 자세히 알아 보려면
4. 활성 스레드 전환
스레드를 전환하려면
스레드 창, 디버그 위치 도구 모음의 스레드 상자, 소스 창의 스레드 표시기를 사용하여 활성 스레드를 변경하는 방법을 살펴 보았습니다.
스레드 표시기를 사용하면 특정 위치에서 중지된 스레드로만 전환할 수 있습니다. 스레드 창 및 디버그 위치 도구 모음을 사용하면 임의의 스레드로 전환할 수 있습니다.
5. 스레드 실행 중지 및 재개
스레드를 중지 및 해제하려면
방법: 고성능 클러스터에서 디버깅
고성능 클러스터에서 다중 프로세스 프로그램을 디버깅하는 방법은 원격 컴퓨터에서 일반적인 프로그램을 디버깅하는 방법과 비슷합니다. 그러나 여기에는 몇 가지 추가로 고려해야 할 사항이 있습니다. 원격 클러스터 디버깅 설치 요구 사항에 대한 자세한 내용은 방법: 원격 클러스터 응용 프로그램 디버깅을 참조하십시오. 일반적인 원격 설치 요구 사항에 대한 자세한 내용은 원격 디버깅 설치를 참조하십시오.
고성능 클러스터에서 디버깅하는 경우 원격 디버깅에 제공되는 Visual Studio 디버깅 창과 기술을 모두 사용할 수 있습니다. 그러나 디버깅을 원격으로 수행하므로 외부 콘솔 창은 사용할 수 없습니다.
스레드 창과 프로세스 창은 병렬 응용 프로그램을 디버깅하는 데 특히 유용합니다. 이러한 창을 사용하는 방법에 대한 자세한 내용은 방법: 프로세스 창 사용 및 방법: 스레드 창 사용을 참조하십시오.
다음 절차에서는 고성능 클러스터에서 디버깅을 수행할 때 특히 유용한 몇 가지 방법을 보여 줍니다.
병렬 응용 프로그램을 디버깅할 때는 특정 스레드, 프로세스 또는 컴퓨터에 중단점을 설정해야 하는 경우가 있습니다. 일반적인 중단점을 만든 다음 중단점 필터를 추가하면 이를 쉽게 수행할 수 있습니다.
중단점 필터 대화 상자를 열려면
특정 프로세스에 중단점을 설정하려면
특정 스레드에 중단점을 설정하려면
예제
다음 예제에서는 marvin이라는 컴퓨터와 fourier1이라는 스레드에 중단점 필터를 만드는 방법을 보여 줍니다.
(MachineName = marvin) & (ThreadName = fourier1)
네이티브 코드의 스레드 디버깅 팁
다음은 네이티브 코드에서 스레드를 디버깅할 때 사용할 수 있는 몇 가지 팁입니다.
병렬 작업 창 사용
관리되는 코드에서 System.Threading.Tasks.Task 개체로 작업할 때 병렬 작업 창을 사용할 수 있습니다. 관리 코드의 작업에 대한 자세한 내용은 .NET Framework의 병렬 프로그래밍을 참조하십시오.
네이티브 코드에서 작업 그룹, 병렬 알고리즘, 비동기 에이전트 및 간단한 작업을 작업하는 경우 병렬 작업 창을 사용할 수 있습니다. 네이티브 코드의 작업에 대한 자세한 내용은 동시성 런타임을 참조하십시오.
중단하고 디버거를 실행할 때마다 병렬 작업 창을 사용할 수 있습니다. You can access it on the Debug menu by clicking Windows and then clicking Parallel Tasks. 다음 그림에서는 기본 모드의 병렬 작업 창을 보여 줍니다.
1. 병렬 작업 열 정보
병렬 작업 창의 열에는 다음 정보가 표시됩니다.
열 이름 | 설명 | |
플래그 | 플래그 설정된 작업이 표시되며 작업에 플래그를 설정하거나 해제할 수 있습니다. | |
아이콘 | 노란색 화살표는 현재 작업을 나타냅니다. 현재 작업은 현재 스레드의 최상위 작업입니다.
흰색 화살표는 중단 작업(디버거가 호출된 현재 작업)을 나타냅니다. 일시 중지 아이콘은 사용자가 중지한 작업을 나타냅니다. 목록에서 작업을 마우스 오른쪽 단추로 클릭하여 작업을 중지하거나 중지된 작업을 해제할 수 있습니다. | |
ID | 시스템에서 제공한 작업 번호입니다. 네이티브 코드에서는 작업의 주소입니다. | |
상태 | 작업의 현재 상태(예약됨, 실행 중, 교착 상태 또는 대기 중)입니다. 예약된 작업은 아직 실행되지 않은 작업이므로 호출 스택, 할당된 스레드 또는 관련 작업이 없습니다.
실행 중인 작업은 디버거를 실행하기 전에 코드를 실행 중이었던 작업입니다. 대기 중인 작업은 이벤트가 신호를 받거나, 잠금이 해제되거나, 다른 작업이 완료되기를 기다리고 있어서 차단된 작업입니다. 교차 상태의 작업은 해당 스레드와 다른 스레드 간에 교착 상태가 발생한 대기 중인 작업입니다. 교착 상태의 작업 또는 대기 중인 작업의 상태 셀을 가리키면 블록에 대한 자세한 정보를 볼 수 있습니다.
| |
위치 | 작업의 호출 스택의 현재 위치입니다. 이 셀을 가리키면 작업에 대한 전체 호출 스택을 볼 수 있습니다. 예약된 작업의 이 열에는 값이 없습니다. | |
작업 | 작업이 생성될 때 작업으로 전달된 초기 메서드와 인수입니다. | |
부모 | 이 작업을 만든 작업의 ID입니다. 비어 있으면 작업에 부모가 없는 것입니다. 관리되는 프로그램에만 적용됩니다. | |
스레드 할당 | 작업이 실행 중인 스레드의 ID 및 이름입니다. | |
AppDomain | 관리 코드의 경우 작업이 실행되고 있는 응용 프로그램 도메인입니다. | |
task_group | 네이티브 코드의 경우 작업을 예약한 task_group의 주소입니다. 비동기 에이전트 및 간단한 작업의 경우 이 열은 0으로 설정됩니다. |
열 머리글을 마우스 오른쪽 단추로 클릭하고 원하는 열을 선택하여 뷰에 추가할 수 있습니다. 열을 제거하려면 선택을 취소합니다. 또한 왼쪽이나 오른쪽으로 끌어서 열을 다시 정렬할 수도 있습니다. 열 바로 가기 메뉴가 다음 그림에 표시됩니다.
2. 작업 정렬
열 조건으로 작업을 정렬하려면 열 머리글을 클릭합니다. 예를 들어, ID 열 머리글을 클릭하여 1,2,3,4,5 등의 작업 ID로 작업을 정렬할 수 있습니다. 정렬 순서를 반대로 바꾸려면 열 머리글을 다시 클릭합니다. 현재 정렬 열과 정렬 순서는 열에 화살표로 표시됩니다.
3. 작업 그룹화
목록 뷰에서 열을 기준으로 작업을 그룹화할 수 있습니다. 예를 들어, 상태 열 머리글을 마우스 오른쪽 단추로 클릭하고 상태별 그룹을 클릭하면 동일한 상태의 모든 작업을 그룹화할 수 있습니다. 예를 들어, 대기 중인 작업만 빨리 확인하여 차단된 이유를 살펴볼 수 있습니다. 또한 디버그 세션 중에 관심 없는 그룹을 축소할 수도 있습니다. 동일한 방식으로 다른 열을 기준으로 그룹화할 수 있습니다. 그룹 머리글 옆의 단추를 클릭하여 간단하게 그룹에 플래그를 설정하거나 해제할 수 있습니다. 다음 그림에서는 그룹화된 모드의 병렬 작업 창을 보여 줍니다.
4. 부모 자식 뷰
이 뷰는 관리 코드에서만 사용할 수 있습니다. 열 머리글을 마우스 오른쪽 단추로 클릭하고 부모 자식 뷰를 클릭하여 작업 목록을 계층적 뷰로 변경할 수 있습니다. 계층적 뷰에서 모든 자식 작업은 부모 아래에 표시하거나 숨길 수 있는 하위 노드입니다. 다음 그림은 부모 자식 뷰의 작업을 보여 줍니다.
5. 작업에 플래그 설정
작업 목록 항목을 마우스 오른쪽 단추로 클릭하고 플래그 설정을 클릭하거나 첫 번째 열에서 플래그 아이콘을 클릭하여 작업에 플래그를 설정할 수 있습니다. 여러 작업에 플래그를 설정하는 경우 플래그 설정된 작업에만 초점을 맞출 수 있도록 플래그 설정된 모든 작업을 맨 위로 오게 플래그 열을 정렬할 수 있습니다. 병렬 스택 창을 사용하여 플래그 설정된 작업만 볼 수도 있습니다. 이렇게 하면 디버깅 중 관심 없는 작업을 필터링할 수 있습니다. 플래그는 디버깅 세션 간에 유지되지 않습니다.
6. 작업 중지 및 재개
작업 목록 항목을 마우스 오른쪽 단추로 클릭하고 할당된 스레드 중지를 클릭하여 작업이 실행되고 있는 스레드를 중지할 수 있습니다. 작업이 이미 중지되었으면 할당된 스레드 재개 명령이 표시됩니다. 스레드를 중지하면 현재 중단점 이후에 코드를 단계별로 실행할 때 해당 스레드가 실행되지 않습니다. 이 스레드를 제외한 모든 스레드 중지 명령은 작업 목록 항목을 실행 중인 스레드를 제외한 모든 스레드를 중지합니다.
다음 그림에서는 각 작업에 대한 다른 메뉴 항목을 보여 줍니다.
병렬 스택 창 사용
병렬 스택 창은 다중 스레드 응용 프로그램을 디버깅할 때 유용합니다. 스레드 뷰에는 응용 프로그램의 모든 스레드에 대한 호출 스택 정보가 표시됩니다. 따라서 스레드와 스레드 스택 프레임 간을 탐색할 수 있습니다. 관리되는 코드에서 작업 뷰는 System.Threading.Tasks.Task 개체의 호출 스택이 표시됩니다. 네이티브 코드에서 작업 뷰는 작업 그룹, 병렬 알고리즘, 비동기 에이전트 및 간단한 작업의 호출 스택이 표시됩니다.
1. 스레드 뷰
다음 그림에서는 Main에서 A, B 및 외부 코드로 차례로 이동한 하나의 스레드를 보여 줍니다. 다른 두 스레드는 외부 코드에서 시작한 후 A로 이동했지만, 그 중 하나는 B로 진행한 후 외부 코드로 진행했고 다른 하나는 C로 진행한 후 AnonymousMethod로 진행했습니다.
그림에서 현재 스레드의 호출 경로는 파란색으로 강조 표시되며, 활성 스택 프레임은 노란색 화살표로 표시됩니다. 병렬 스택 창에서 다른 메서드를 선택하여 현재 스택 프레임을 변경할 수 있습니다. 이렇게 하면 선택한 메서드가 현재 스레드의 일부인지 아니면 다른 스레드의 일부인지에 따라 현재 스레드가 전환될 수 있습니다. 다음 표에서는 그림에 표시된 병렬 스택 창의 기본 기능에 대해 설명합니다.
설명선 문자 | 요소 이름 | 설명 |
A | 호출 스택 세그먼트 또는 노드 | 하나 이상의 스레드에 대한 일련의 메서드 컨텍스트를 포함합니다. 노드에 연결된 화살표 선이 없으면 스레드에 대한 전체 호출 경로를 나타냅니다. |
B | 파란색 강조 표시 | 현재 스레드의 호출 경로를 나타냅니다. |
C | 화살표 선 | 노드를 연결하여 스레드에 대한 전체 호출 경로를 구성합니다. |
D | 노드 머리글에 대한 도구 설명 | 호출 경로가 이 노드를 공유하는 각 스레드의 ID 및 사용자 정의 이름을 표시합니다. |
E | 메서드 컨텍스트 | 동일한 메서드에 있는 하나 이상의 스택 프레임을 나타냅니다. |
F | 메서드 컨텍스트에 대한 도구 설명 | 메서드 컨텍스트가 나타내는 모든 스택 프레임의 세부 정보를 표시합니다. 현재 스레드의 스택 프레임이 굵게 표시됩니다. |
또한 그래프가 너무 커서 창에 맞지 않는 경우에는 병렬 스택 창의 주 창에 Bird's Eye View 아이콘이 표시됩니다. 전체 그래프를 창에서 보려면 이 아이콘을 클릭하면 됩니다.
2. 메서드 컨텍스트 아이콘
다음 표에서는 활성 및 현재 스택 프레임에 대한 정보를 제공하는 아이콘을 설명합니다.
아이콘 | 설명 |
|
메서드 컨텍스트에 현재 스레드의 활성 스택 프레임이 포함되어 있음을 나타냅니다. |
메서드 컨텍스트에 현재 스레드가 아닌 스레드의 활성 스택 프레임이 포함되어 있음을 나타냅니다. | |
메서드 컨텍스트에 현재 스택 프레임이 포함되어 있음을 나타냅니다. 메서드 이름이 나타나는 모든 노드에서 메서드 이름이 굵게 표시됩니다. |
3. 도구 모음 컨트롤
다음 그림과 표에서는 병렬 스택 도구 모음에서 사용할 수 있는 컨트롤에 대해 설명합니다.
설명선 문자 | 컨트롤 | 설명 |
A | 스레드/작업 콤보 상자 | 스레드의 호출 스택과 작업의 호출 스택 간에 뷰를 전환합니다. 자세한 내용은 작업 뷰와 스레드 뷰를 참조하십시오. |
B | 프래그 설정된 항목만 표시 | 스레드 창이나 병렬 작업 창에서 플래그 설정된 스레드 또는 작업에 대해서만 호출 스택을 표시합니다. |
C | 메서드 뷰 설정/해제 | 스택 뷰와 메서드 뷰 간을 전환합니다. 자세한 내용은 메서드 뷰를 참조하십시오. |
D | 현재 스택 프레임으로 자동 스크롤 | 현재 스택 프레임이 뷰에 표시되도록 다이어그램을 자동 스크롤합니다. 이 기능은 다른 창에서 현재 스택 프레임을 변경하거나 큰 다이어그램에서 새 중단점을 적중할 때 유용합니다. |
E | 확대/축소 컨트롤 설정/해제 | 확대/축소 컨트롤을 표시하거나 숨깁니다. 확대/축소 컨트롤의 표시 여부와 관계없이 Ctl 키를 누른 상태에서 마우스 휠을 돌려서 확대/축소할 수도 있습니다. |
상황에 맞는 메뉴 항목
다음 그림과 표에서는 스레드 뷰와 작업 뷰에서 메서드 컨텍스트를 마우스 오른쪽 단추로 클릭할 때 사용할 수 있는 바로 가기 메뉴 항목에 대해 설명합니다. 마지막 6개 항목은 호출 스택 창에서 직접 가져온 것으로 새로운 동작을 제공하지 않습니다.
Menu Item | 설명 |
작업으로 이동 또는 스레드로 이동 | 도구 모음의 콤보 상자와 같은 기능을 수행하지만 동일한 스택 프레임이 강조 표시된 상태로 유지됩니다. |
프레임으로 전환 | 호출 스택 창의 해당 메뉴 명령과 동일합니다. 그러나 병렬 스택을 사용하는 경우 여러 프레임이 하나으 메서드 컨텍스트에 해당할 수 있습니다. 따라서 메뉴 항목에 하위 메뉴가 잇고 각각의 하위 메뉴가 특정 스텍프레임을 나타냅니다. 스택 프레임 중 하나가 현재 스레드에 있으면 스택 프레임에 해당하는 메뉴가 선택됩니다. |
소스 코드로 이동 | 사용자가 마우스 오른쪽 단추로 클릭한 스택 프레임에 해당하는 소스 코드의 위치로 이동합니다. |
디스어셈블리로 이동 | 사용자가 마우스 오른쪽 단추로 클릭한 스택 프레임에 해당하는 디스어셈블리 창의 위치로 이동합니다. |
외부 코드 표시 | 외부 코드를 표시하거나 숨깁니다. |
16진수 표시 | 10진수 표시와 16진수 표시 간을 전환합니다. |
기호 로드 정보 | 해당하는 대화 상자를 표시합니다. |
기호 설정 | 해당하는 대화 상자를 표시합니다. |
4. 작업 뷰
응용 프로그램에서 System.Threading.Tasks.Task 개체(관리 코드)나 task_handle 개체(네이티브 코드)를 사용하여 병렬화를 표현하는 경우 병렬 스택 창 도구 모음의 콤보 상자를 사용하여 작업 뷰로 전환할 수 있습니다. 작업 뷰에는 스레드 대신 작업의 호출 스택이 표시됩니다. 작업 뷰는 다음과 같이 스레드 뷰와 다릅니다.
다음 그림의 오른쪽에는 병렬 스택 작업 뷰가 표시되고 왼쪽에는 해당 스레드 뷰가 표시됩니다.
전체 호출 스택을 보려면 스택 프레임을 마우스 오른쪽 단추로 클릭하고 스레드로 이동을 클릭하여 스레드 뷰로 전환하면 됩니다.
그림에서 작업 뷰의 노드 머리글은 노드가 표현하는 작업의 상태를 나타냅니다. 앞의 표에서 설명했듯이 노드 머리글 또는 메서드 컨텍스트를 가리키면 추가 정보를 볼 수 있습니다. 다음 이미지에서는 스레드 뷰와 작업 뷰에 대한 정보를 도구 설명으로 보여 줍니다.
5. 메서드 뷰
스레드 뷰나 작업 뷰에서 도구 모음의 메서드 뷰 아이콘을 클릭하여 현재 메서드를 축으로 그래프를 회전할 수 있습니다. 메서드 뷰에서는 현재 메서드를 호출하거나 현재 메서드에 의해 호출되는 모든 스레드에 대한 메서드를 모두 한눈에 볼 수 있습니다. 다음 그림에서는 스레드 뷰를 보여 주며, 메서드 뷰에서 동일한 정보가 어떻게 표시되는지도 보여 줍니다.
새 스택 프레임으로 전환하여 해당 메서드를 현재 메서드로 설정하고 창에 새 메서드에 대한 모든 호출자 및 호출 수신자를 표시합니다. 이렇게 하면 메서드가 호출 스택에 표시되는지 여부에 따라 일부 스레드가 뷰에 나타나거나 사라집니다. 스택 뷰로 돌아가려면 메서드 뷰 도구 모음 단추를 다시 클릭합니다.
연습: 병렬 응용 프로그램 디버깅
이 연습에서는 병렬 작업 및 병렬 스택 창을 사용하여 병렬 응용 프로그램을 디버깅하는 방법을 보여 줍니다. 이 두 창은 작업 병렬 라이브러리 또는 동시성 런타임을 사용하는 코드의 런타임 동작을 이해하고 확인하는 데 도움이 됩니다. 이 연습에서는 기본 제공 중단점이 있는 샘플 코드를 제공합니다. 또한 코드가 중단된 후 병렬 작업 및 병렬 스택 창을 사용하여 코드를 검사하는 방법을 보여 줍니다.
이 연습에서는 다음 작업 방법을 배웁니다.
1. 사전 요구 사항
컴퓨터에 Visual Studio 2010이 설치되어 있어야 합니다.
이 연습에서는 내 코드만이 사용된다고 가정합니다. 도구 메뉴에서 옵션을 클릭하고 디버깅 노드를 확장한 다음 일반을 선택하고 내 코드만 사용(관리 전용)을 선택합니다. 이 기능을 설정하지 않아도 연습을 사용할 수 있지만 결과가 그림과 다를 수 있습니다.
C# 샘플을 사용하는 경우 이 연습에서는 외부 코드가 숨겨져 있다고 가정합니다. 외부 코드의 표시 여부를 전환하려면 호출 스택 창의 이름 표 머리글을 마우스 오른쪽 단추로 클릭하고 외부 코드 표시를 선택하거나 지웁니다. 이 기능을 설정하지 않아도 연습을 사용할 수 있지만 결과가 그림과 다를 수 있습니다.
그림
이 항목의 그림은 C# 샘플을 실행하는 쿼드 코어 컴퓨터에서 기록되었습니다. 다른 구성을 사용하여 이 연습을 수행할 수도 있지만 그림이 컴퓨터에 표시되는 것과 다를 수 있습니다.
2. 샘플 프로젝트 만들기
이 연습의 샘플 코드는 아무 작업도 수행하지 않는 응용 프로그램의 코드입니다. 이 코드의 목표는 단지 도구 창을 사용하여 병렬 응용 프로그램을 디버깅하는 방법을 이해하는 것입니다.
샘플 프로젝트를 만들려면
using System; using System.Threading; using System.Threading.Tasks; using System.Diagnostics; class S t1 = new Task(A, 1); Console.ReadLine(); static void A(object o) Interlocked.Increment(ref aa); if (temp == 1) //after
switch (temp2)
switch (temp3)
Task.Factory.StartNew(T, i + 1 + 5, TaskCreationOptions.AttachedToParent); //scheduled //BP4 - 1 in M, 2 in R, 3 in J, 4 in R, 5 died
|
3. 병렬 스택 창 사용: 스레드 뷰
디버그 메뉴에서 디버깅 시작을 클릭합니다. 첫 번째 중단점이 적중될 때까지 기다립니다.
단일 스레드의 호출 스택을 보려면
병렬 스택 창을 검사하려면
주 스레드의 호출 스택이 한 상자에 표시되고 다른 4개의 스레드에 대한 호출 스택이 다른 상자에서 그룹화됩니다. 4개의 스레드는 해당 스택 프레임이 동일한 메서드 컨텍스트를 공유 즉, 동일한 메서드인 A, B 및 C에 있기 때문에 그룹화됩니다. 동일한 상자를 공유하는 스레드의 이름과 스레드 ID를 보려면 머리글(4개 스레드)을 가리킵니다. 다음 그림과 같이 현재 스레드가 굵게 표시됩니다.
노란색 화살표는 현재 스레드의 활성 스택 프레임을 나타냅니다. 자세한 정보를 보려면 해당 항목을 가리킵니다.
호출 스택 창을 마우스 오른쪽 단추로 클릭하여 스택 프레임에 대해 표시할 정보(모듈 이름, 매개 변수 형식, 매개 변수 이름, 매개 변수 값, 줄 번호 및 바이트 오프셋)를 설정할 수 있습니다.
상자 주변의 파란색 강조 표시는 현재 스레드가 해당 상자의 일부임을 나타냅니다. 현재 스레드는 도구 설명에서 굵은 스택 프레임으로도 표시됩니다. 스레드 창에서 주 스레드를 두 번 클릭하면 그에 따라 병렬 스택 창의 파란색 강조 표시가 이동하는 것을 볼 수 있습니다.
2번째 중단점까지 실행을 계속하려면
첫 번째 중단점에서 4개 스레드가 모두 S.A 메서드에서 S.B 메서드로 이동되고 다시 S.C 메서드로 이동되었습니다. 해당 정보가 병렬 스택 창에 계속 표시되지만 4개 스레드는 더 진행되었습니다. 그 중 하나가 S.D와 S.E로 진행되었습니다. 다른 하나는 S.F, S.G 및 S.H로 진행되었습니다. 나머지 두 개는 S.I와 S.J로 진행되었으며, 이 중단점에서 스레드 중 하나가 S.K로 이동되었고 다른 하나는 사용자 코드가 아닌 외부 코드로 진행되었습니다.
상자 머리글(1개 스레드 또는 2개 스레드)을 가리키면 스레드의 ID를 볼 수 있습니다. 스택 프레임을 가리키면 스레드 ID와 기타 스레드 정보를 볼 수 있습니다. 파란색 강조 표시는 현재 스레드를 나타내며 노란색 화살표는 현재 스레드의 활성 스택 프레임을 나타냅니다.
실 모양 아이콘(겹친 파란색 및 빨간색 물결선)은 현재 스레드가 아닌 스레드의 활성 스택 프레임을 나타냅니다. 호출 스택 창에서 S.B를 두 번 클릭하여 프레임을 전환합니다. 병렬 스택 창은 구부러진 녹색 화살표 아이콘을 사용하여 현재 스레드의 현재 스택 프레임을 나타냅니다.
스레드 창에서 스레드 간을 전환하고 병렬 스택 창의 뷰가 업데이트되는지 살펴봅니다.
병렬 스택 창에서 바로 가기 메뉴를 사용하여 다른 스레드로 전환하거나 다른 스레드의 다른 프레임으로 전환할 수 있습니다. 예를 들어, S.J를 마우스 오른쪽 단추로 클릭하고 프레임으로 전환을 가리킨 다음 명령을 클릭합니다.
S.C를 마우스 오른쪽 단추로 클릭하고 프레임으로 전환을 가리킵니다. 명령 중 하나에 현재 스레드의 스택 프레임을 나타내는 선택 표시가 있습니다. 동일한 스레드의 해당 프레임으로 전환하거나(녹색 화살표만 이동) 다른 스레드로 전환할 수 있습니다(파란색 강조 표시도 이동). 다음 그림에서는 하위 메뉴를 보여 줍니다.
메서드 컨텍스트가 하나의 스택 프레임에만 연결된 경우 상자 머리글에 1개 스레드가 표시되고 두 번 클릭하여 이 스레드로 전환할 수 있습니다. 두 개 이상의 프레임이 연결된 메서드 컨텍스트를 두 번 클릭하면 메뉴가 자동으로 표시됩니다. 메서드 컨텍스트를 가리키면 오른쪽에 검은색 삼각형이 나타납니다. 이 삼각형을 클릭해도 바로 가기 메뉴가 표시됩니다.
스레드가 많은 대규모 응용 프로그램의 경우 일부 스레드에만 초점을 맞출 수 있습니다. 병렬 스택 창에서는 플래그가 설정된 스레드에 대해서만 호출 스택을 표시할 수 있습니다. 도구 모음에서 목록 상자 옆에 있는 플래그 설정된 항목만 표시 단추를 클릭합니다.
그런 다음 스레드 창에서 각 스레드에 플래그를 설정하여 병렬 스택 창에서 해당 호출 스택이 표시되는 방식을 봅니다. 스레드에 플래그를 설정하려면 바로 가기 메뉴 또는 스레드의 첫 번째 셀을 사용합니다. 플래그 설정된 항목만 표시 도구 모음 단추를 다시 클릭하여 모든 스레드를 표시합니다.
1. 3번째 중단점까지 실행을 계속하려면
다른 두 상자에서 S.L이 굵게 표시되므로 해당 위치를 확인할 수 있습니다. S.L을 호출되는 프레임과 S.L이 호출하는 프레임을 확인하려면 도구 모음에서 메서드 뷰 설정/해제 단추를 클릭합니다. 다음 그림에서는 병렬 스택 창의 메서드 뷰를 보여 줍니다.
다이어그램이 선택한 메서드를 축으로 회전하고 뷰 중간에 있는 자체 상자에 배치됩니다. 호출 수신자와 호출자가 맨 위와 맨 아래에 나타납니다. 메서드 뷰 설정/해제 단추를 다시 클릭하여 이 모드를 종료합니다.
병렬 스택 창의 바로 가기 메뉴에는 다음과 같은 기타 항목도 있습니다.
큰 다이어그램이 있는 경우 다음 중단점으로 한 단계씩 코드를 실행할 때 뷰가 현재 스레드의 활성 스택 프레임(중단점을 처음 적중하는 스레드)으로 자동 스크롤되게 할 수 있습니다. 병렬 스택 창에서 도구 모음의 현재 스택 프레임으로 자동 스크롤 단추가 켜져 있는지 확인합니다.
2. 계속하기 전에 병렬 스택 창에서 왼쪽과 아래쪽으로 스크롤합니다.
4번째 중단점까지 실행을 계속하려면
1. 4번째 중단점이 적중될 때까지 실행을 계속하려면 디버그 메뉴에서 계속을 클릭합니다.
뷰가 어떻게 자동 스크롤되는지 봅니다. 스레드 창에서 스레드를 전환하거나 호출 스택 창에서 스택 프레임을 전환할 때도 뷰가 항상 정확한 프레임으로 자동 스크롤됩니다. 현재 도구 프레임으로 자동 스크롤 옵션을 끄고 차이를 확인합니다.
부감 뷰도 병렬 스택 창에서 큰 다이어그램을 사용할 때 도움이 됩니다. 다음 그림과 같이 창의 오른쪽 맨 아래에 있는 스크롤 막대 사이의 단추를 클릭하여 부감 뷰를 볼 수 있습니다.
사각형을 다이어그램 주변에서 빠르게 이동할 수 있습니다.
사각형을 한 방향으로 이동하는 또 한 가지 방법은 다이어그램의 검은색 영역을 클릭하여 원하는 위치로 끄는 것입니다.
다이어그램을 확대하거나 축소하려면 Ctrl 키를 누른 상태에서 마우스 휠을 움직입니다. 또는 도구 모음의 확대/축소 단추를 클릭하고 확대/축소 도구를 사용합니다.
도구 메뉴를 클릭하고 옵션을 클릭한 다음 디버깅 노드 아래의 옵션을 선택하거나 선택 취소하여 상향식이 아닌 하향식으로 스택을 볼 수도 있습니다.
2. 계속하기 전에 디버그 메뉴에서 디버깅 중지를 클릭하여 실행을 종료합니다.
병렬 작업 창과 병렬 스택 창의 작업 뷰 사용
계속하기 전에 이전 절차를 완료하는 것이 좋습니다.
첫 번째 중단점이 적중될 때까지 응용 프로그램을 다시 시작하려면
실행 중인 각 작업에 대해 같은 이름의 속성에서 반환되는 작업의 ID, 작업을 실행하는 스레드의 ID 및 이름, 작업의 위치가 표시됩니다. 작업을 가리키면 전체 호출 스택이 포함된 도구 설명이 표시됩니다. 또한 작업 열 아래에서 작업에 전달된 메서드 즉, 시작 지점을 볼 수 있습니다.
열을 정렬할 수 있습니다. 정렬 문자 모양이 정렬 열과 방향을 나타냅니다. 열을 왼쪽이나 오른쪽으로 끌어서 열을 다시 정렬할 수도 있습니다.
노란색 화살표는 현재 작업을 나타냅니다. 작업을 두 번 클릭하거나 바로 가기 메뉴를 사용하여 작업을 전환할 수 있습니다. 작업을 전환하면 주 스레드가 현재 스레드가 되고 다른 창이 업데이트됩니다.
작업 간을 수동으로 전환하는 경우 노란색 화살표는 이동하지만 흰색 화살표는 디버거를 중단시킨 작업을 계속 표시합니다.
2번째 중단점까지 실행을 계속하려면
이전에는 상태 열에 모든 작업이 실행 중으로 표시되었지만 이제는 작업 중 두 개가 대기 중입니다. 작업은 다양한 이유로 차단될 수 있습니다. 상태 열에서 대기 중인 작업을 가리키면 해당 작업이 차단된 이유를 알 수 있습니다. 예를 들어, 다음 그림에서 작업 3이 작업 4를 기다리고 있습니다.
작업 4는 작업 2에 할당된 스레드가 소유하는 모니터를 기다리고 있습니다.
병렬 작업 창에서 첫 번째 열의 플래그를 클릭하여 작업에 플래그를 설정할 수 있습니다.
플래그 설정을 사용하여 동일한 디버깅 세션의 여러 중단점 간에 작업을 추적하거나 병렬 스택 창에 호출 스택이 표시되는 작업을 필터링할 수 있습니다.
앞에서 병렬 스택 창을 사용할 때 응용 프로그램 스레드를 보았습니다. 이번에는 병렬 작업 창에서 응용 프로그램 작업을 봅니다. 이렇게 하려면 왼쪽 위의 상자에서 작업을 선택합니다. 다음 그림에서는 작업 뷰를 보여 줍니다.
현재 실행 중인 작업이 아닌 스레드는 병렬 스택 창의 작업 뷰에 표시되지 않습니다. 또한 작업을 실행하는 스레드의 경우 작업과 관련이 없는 스택 프레임 중 일부가 스택의 맨 위와 맨 아래에서 필터링됩니다.
병렬 작업 창을 다시 봅니다. 열 머리글을 마우스 오른쪽 단추로 클릭하여 열의 바로 가기 메뉴를 표시합니다.
바로 가기 메뉴를 사용하여 열을 추가하거나 제거할 수 있습니다. 예를 들어, AppDomain 열은 선택되지 않았으므로 목록에 표시되지 않습니다. 부모를 클릭합니다. 4개 작업 중 하나에 대해 부모 열이 값 없이 표시됩니다.
3번째 중단점까지 실행을 계속하려면
3번째 중단점이 적중될 때까지 실행을 계속하려면 디버그 메뉴에서 계속을 클릭합니다.
지금 새 작업인 작업 5가 실행 중이며 작업 4가 대기 중입니다. 상태 창에서 대기 중인 작업을 가리키면 해당 작업이 대기 중인 이유를 알 수 있습니다. 부모 열에서 작업 4는 작업 5의 부모입니다.
부모-자식 관계를 시각적으로 표현하려면 부모 열 머리글을 오른쪽 단추로 클릭하고 부모 자식 뷰를 클릭합니다. 다음 그림이 표시됩니다.
동일한 스레드에 대해 작업 4와 작업 5가 실행되고 있습니다. 이 정보는 스레드 창에 표시되지 않으므로 여기에서 이 정보를 볼 수 있다는 것은 병렬 작업 창의 또 한 가지 이점입니다. 이를 확인하려면 병렬 스택 창을 봅니다. 작업을 보고 있는지 확인합니다. 병렬 작업 창에서 작업 4와 5를 두 번 클릭하여 해당 작업을 찾습니다. 이때 병렬 스택 창의 파란색 강조 표시가 업데이트됩니다. 병렬 스택 창에서 도구 설명을 검색하여 작업 4와 5를 찾을 수도 있습니다.
병렬 스택 창에서 S.P를 마우스 오른쪽 단추로 클릭하고 스레드로 이동을 클릭합니다. 창이 스레드 뷰로 전환되고 해당 프레임이 뷰에 표시됩니다. 동일한 스레드에서 두 작업을 볼 수 있습니다.
이는 스레드 창과 비교하여 병렬 스택 창의 작업 뷰를 사용할 때의 또 한 가지 이점입니다.
4번째 중단점까지 실행을 계속하려면
작업 5가 완료되어 더 이상 표시되지 않습니다. 그렇지 않고 교착 상태도 표시되지 않으면 F11 키를 눌러 한 단계씩 코드를 실행합니다.
작업 3과 작업 4가 서로 대기 중이어서 교착 상태에 있습니다. 또한 작업 2의 자식인 5개의 새 작업이 있고 현재 예약되어 있습니다. 예약된 작업은 코드 내에서는 시작되었지만 아직 실행되지 않은 작업입니다. 따라서 위치와 스레드 할당 열이 비어 있습니다.
병렬 스택 창을 다시 봅니다. 각 상자의 머리글에는 스레드 ID 및 이름을 표시하는 도구 설명이 있습니다. 병렬 스택 창에서 작업 뷰로 전환합니다. 그림과 같이 머리글을 가리키면 작업 ID, 이름 및 상태가 표시됩니다.
열별로 작업을 그룹화할 수 있습니다. 병렬 작업 창에서 상태 열 머리글을 오른쪽 단추로 클릭하고 상태별로 그룹화를 클릭합니다. 다음 그림에서는 상태별로 그룹화된 병렬 작업 창을 보여 줍니다.
다른 열을 기준으로 그룹화할 수도 있습니다. 작업을 그룹화하여 일부 작업에만 초점을 맞출 수 있습니다. 축소 가능한 그룹마다 함께 그룹화되는 항목 수가 있습니다. 또한 축소 단추의 오른쪽에 있는 플래그 설정 단추를 클릭하여 그룹의 모든 항목에 빠르게 플래그를 설정할 수 있습니다.
마지막으로 살펴볼 병렬 작업 창의 기능은 작업을 오른쪽 단추로 클릭할 때 표시되는 바로 가기 메뉴입니다.
바로 가기 메뉴에는 작업 상태에 따라 다양한 명령이 표시됩니다. 명령에는 복사, 모두 선택, 16진수 표시, 작업으로 전환, 할당된 스레드 중지, 이 스레드를 제외한 모든 스레드 중지, 할당된 스레드 재개 및 플래그 설정이 있습니다.
작업의 내부 스레드를 중지하거나 할당된 스레드를 제외한 모든 스레드를 중지할 수 있습니다. 중지된 스레드는 스레드 창에서처럼 병렬 작업 창에 표시되며 옆에 파란색 일시 중지 아이콘이 있습니다.
---------------------------------------------------------------
나이 50?에 프로그램에 입문합니다. 혹자는 가능하지 않으리라 여길지 모르겠습니다.
그러나 나는 생각합니다. 할. 수. 있. 다!
學而時習之 不亦說乎, 有朋自遠方來 不亦樂乎? 人不知而不溫 不亦君子乎.
(학이시습지 불역열호, 유붕자 원방래 불역 락호? 인부지 이불온 불역 군자호.)
물론, 깨달음의 경지를 얻은 공자의 말씀은 지금의 나에게는 가당치않은 상황일 것입니다만, "일신우일신"이란 뜻과 같이 항상 새로운 마음으로 또다른 내일을 향하여 마음을 다잡는다면 목표한 바가 그리 멀리있지는 않으리라 생각합니다.