|
방법: 숨겨진 디버거 명령 복원
----------------------------
Visual Studio를 설치할 때 주 프로그래밍 언어의 기본 IDE 설정 집합을 선택하는 단계가 있습니다. 일부 언어의 기본 IDE 설정에서는 특정 디버거 명령이 표시되지 않을 수 있습니다.
기본 IDE 설정에 따라 숨겨진 디버거 기능을 사용하려면 다음 절차를 사용하여 명령을 메뉴에 다시 추가해야 합니다.
숨겨진 디버거 명령을 복원하려면
사용자 지정 대화 상자에서 사용할 수 없는 명령 복원
특히 계층 구조 메뉴에 있는 명령과 같은 일부 명령은 사용자 지정 대화 상자에서 복원할 수 없습니다. 이러한 명령을 복원하려면 IDE 설정의 새 컬렉션을 가져와야 합니다.
새 IDE 설정을 가져오려면
실행 제어
-------------------------------------
Visual Studio 디버거에는 응용 프로그램 실행을 제어하는 유용한 명령들이 있습니다. 다음 항목에서는 디버거 명령을 사용하여 실행 제어를 수행할 수 있는 작업에 대해 설명합니다.
방법: 실행 시작
실행 시작은 가장 기본적인 디버깅 기능 중 하나입니다.
참고
표시되는 대화 상자와 메뉴 명령은 활성 설정이나 버전에 따라 도움말에서 설명하는 것과 다를 수 있습니다. 설정을 변경하려면 도구 메뉴에서 설정 가져오기 및 내보내기를 선택합니다. 자세한 내용은 설정에 대한 작업를 참조하십시오.
디버깅을 시작하려면
시작을 선택하면 응용 프로그램이 시작되고 중단점에 도달할 때까지 실행됩니다. 언제든지 실행을 중단하여 값을 검사하고 변수를 수정할 수 있으며 프로그램의 상태를 검사할 수도 있습니다. 자세한 내용은 실행 중단을 참조하십시오.
한 단계씩 코드 실행이나 프로시저 단위 실행을 선택하면 응용 프로그램이 시작되어 실행되다가 첫째 줄에서 중단됩니다.
커서까지 실행을 선택하면 응용 프로그램이 시작되고 중단점 또는 커서 위치 중 하나에 먼저 도달할 때까지 실행됩니다. 커서 위치는 소스 창에서 설정할 수 있습니다. 중단이 발생하지 않는 경우도 있는데, 이는 커서가 설정되어 있는 코드 위치까지 실행되지 않았다는 것을 뜻합니다.
솔루션에 프로젝트가 둘 이상 포함될 수도 있습니다. 이러한 경우 디버그 메뉴의 실행 명령을 사용하여 시작할 시작 프로젝트를 선택할 수 있습니다. 또는 솔루션 탐색기에서 선택한 프로젝트를 시작할 수 있습니다.
디버그 메뉴의 디버깅하지 않고 시작 명령을 사용하면 디버거를 사용하지 않고 프로젝트를 실행할 수 있습니다.
참고
코드가 빌드될 때 디버그 정보가 포함되었는지 여부, 디버거에서 소스 코드에 액세스할 수 있는지 여부, 공용 언어 런타임 JIT 컴파일러에서 디버그 정보를 추적하는지 여부 등에 따라 디버그 기능이 제한될 수도 있습니다. Visual Studio 디버거에서는 프로그램에 대한 디버그 정보를 찾지 못하면 대개 일치하는 기호화된 정보가 없다는 내용의 오류 메시지를 표시합니다. 메시지를 표시하지 않고 시작 명령을 "디버깅하지 않고 시작"으로 처리하는 경우도 있습니다. 디버그 정보는 기본적으로 프로그램의 디버그 구성을 만들 때 생성됩니다. 디버거에서 기호를 찾지 못하는 경우 기호 경로를 지정해야 합니다. 자세한 내용은 방법: 기호 위치 및 로딩 동작 지정를 참조하십시오. 시스템 호출의 디버깅을 돕기 위해 시스템 디버그 기호를 설치할 수 있습니다. 자세한 내용은 시스템 디버그 기호 설치를 참조하십시오.
참고
Windows Server 2003이나 Windows 2000 SP3 이상에 .NET Framework를 설치한 경우 컴퓨터를 다시 부팅하지 않으면 디버거에서 터미널 서비스 세션의 제한된 사용자 계정으로 프로세스를 시작할 수 없습니다.
방법: 선택한 프로젝트 실행 시작
솔루션의 프로젝트를 선택하여 디버깅을 시작할 수 있습니다.
프로젝트를 선택하고 실행을 시작하려면
여러 프로세스 디버깅
Visual Studio 디버거를 사용하면 여러 프로세스에서 실행되는 프로그램을 디버깅할 수 있습니다. 프로세스는 자체의 개체 코드, 데이터 및 리소스를 사용하여 자체의 메모리 공간에서 실행되는 프로그램 인스턴스입니다. 예를 들어, EXE를 실행하여 프로그램을 시작하면 시스템 스케줄러가 해당 프로그램에 대한 새 프로세스를 만듭니다. 여러 프로그램 인스턴스를 실행하면 여러 프로세스가 만들어집니다. 운영 체제에서는 내부적으로 사용할 프로세스(시스템 프로세스)를 자동으로 만듭니다.
다음은 여러 프로세스를 디버깅할 때의 몇 가지 고려 사항과 지침입니다.
스크립트 응용 프로그램
스크립트 응용 프로그램과 같은 일부 프로그램에는 자체의 프로세스가 없습니다. 이러한 프로그램은 Internet Explorer 또는 인터넷 정보 서비스와 같은 다른 응용 프로그램에서 호스팅되며, 호스트의 프로세스에서 실행됩니다. 이러한 프로그램을 디버깅하려면 호스트 프로세스를 디버깅해야 합니다. 이를 위해서는 보통 호스트 프로세스에 연결해야 합니다. 자세한 내용은 스크립트 및 웹 응용 프로그램 디버깅을 참조하십시오.
여러 프로세스에 대한 디버깅 기술
Visual Studio 디버거를 사용하면 Visual Studio 솔루션 내의 여러 프로세스를 디버깅할 수 있습니다. 이 경우에는 각 프로세스가 솔루션 내의 별도의 프로젝트에 의해 만들어지므로 이를 여러 프로젝트의 디버깅으로 간주할 수 있습니다. 여러 개의 시작 프로젝트를 설정하여 디버깅할 수도 있고, 한 프로젝트의 디버깅을 시작한 다음 솔루션 탐색기에서 추가 프로젝트를 시작할 수도 있습니다. 여러 프로젝트에 대한 자세한 내용은 시작 프로젝트 선택을 참조하십시오.
디버깅 작업을 한 프로세스에서 다른 프로세스로 전환하려면 디버그 위치 도구 상자를 사용합니다. 자세한 내용은 방법: 다중 프로세스 디버깅를 참조하십시오.
또한 Visual Studio에서는 Visual Studio의 외부에서 시작된 프로세스도 디버깅할 수 있습니다. 그렇게 하려면 Visual Studio를 시작하고 실행 중인 프로세스에 연결해야 합니다. Visual Studio의 내부와 외부에서 시작된 프로세스를 동시에 디버깅할 수 있습니다. 자세한 내용은 실행 중인 프로그램 또는 여러 프로그램에 연결을 참조하십시오.
방법: 다중 프로세스 디버깅
프로세스마다 서로 다른 언어를 실행하고 있는 경우에도 여러 프로세스를 디버깅할 수 있습니다. 예를 들어, C++로 작성된 코드가 들어 있는 프로세스와 Visual Basic으로 작성된 코드가 들어 있는 다른 프로세스를 동시에 디버깅할 수 있습니다. 일반적으로 혼합 언어 디버깅은 Visual Studio 디버거에서 해당 언어를 지원하는 경우에는 투명하게 수행됩니다.
추가 프로젝트 시작
한 프로젝트가 이미 실행되고 있을 때 다른 프로젝트를 시작하려면 두 프로젝트 모두 같은 솔루션에 있어야 합니다. 추가 프로젝트는 솔루션 탐색기를 사용하여 시작할 수 있습니다.
참고
표시되는 대화 상자와 메뉴 명령은 활성 설정이나 버전에 따라 도움말에서 설명하는 것과 다를 수 있습니다. 설정을 변경하려면 도구 메뉴에서 설정 가져오기 및 내보내기를 선택합니다. 자세한 내용은 설정에 대한 작업를 참조하십시오.
솔루션 탐색기에서 프로젝트를 시작하려면
실행 중인 프로젝트들 사이에서 전환
한 솔루션에 포함된 둘 이상의 프로젝트를 디버깅하는 경우 두 가지 방법 중 어느 것을 사용하더라도 프로젝트 간에 전환할 수 있습니다.
디버깅하는 동안 프로젝트 간에 전환하려면
프로세스 중단 동작을 변경하려면
현재 프로세스만 중지하려면
방법: 디버깅 중지 및 실행 중지
-------------------------------
디버깅을 중지하면 디버깅 세션이 종료됩니다. 실행을 중지하면 디버깅하고 있는 프로세스가 종료되고 디버깅 세션이 끝납니다. 디버깅 세션이 활성인 상태에서 일시적으로 디버깅 중인 프로세스의 실행을 멈추는 실행 중단과 실행 중지를 혼동하지 마십시오. 자세한 내용은 실행 중단을 참조하십시오.
절차
디버깅을 중지 : 디버그 메뉴에서 디버깅 중지를 선택합니다.
디버깅 중지는 Visual Studio에서 프로그램을 시작한 경우 디버깅 중인 프로세스를 종료합니다. Visual Studio에서 프로세스를 시작하지 않고 해당 프로세스에 연결한 경우에는 프로세스가 계속 실행됩니다. 연결된 프로세스를 종료하려면 프로세스 창에서 프로세스를 하나씩 종료하거나 모두 종료 명령을 사용하여 연결된 모든 프로세스를 종료합니다.
연결된 모든 프로세스 디버깅을 종료 : 디버그 메뉴에서 모두 종료를 선택합니다.
현재 디버깅 중인 실행을 중지하고 즉시 새로운 실행을 시작 : 다시 시작 명령을 사용합니다.
디버그 메뉴에서 다시 시작을 선택합니다.
다시 시작은 현재 디버깅 세션을 중지하고 시작 프로젝트를 다시 시작합니다.
디버깅하고 있는 응용 프로그램을 종료하면 디버깅이 자동으로 중지됩니다. 여러 프로그램을 디버깅하는 경우에는 마지막 프로그램이 종료할 때까지 디버깅이 계속됩니다. 예를 들어, Microsoft Internet Explorer에서 호스팅하는 웹 프로젝트처럼 다른 응용 프로그램에서 호스팅하는 프로젝트를 디버깅하는 경우, Microsoft Internet Explorer와 같은 호스트 응용 프로그램을 종료하면 디버깅이 중지됩니다.
Visual Basic과 C#의 경우, 웹 서비스를 디버깅하는 중에 해당 서비스를 사용하는 클라이언트 응용 프로그램이 종료되면 웹 서비스의 디버깅이 중지됩니다.
방법: 실행 중단
----------------
Visual Studio 디버거를 사용하여 응용 프로그램을 디버깅할 때 응용 프로그램은 실행 중이거나 중단 모드로 설정되어 있습니다. 조사식 창에서 식을 계산하는 기능과 같은 대부분의 디버거 기능은 중단 모드에서만 사용할 수 있습니다.
실행이 중단점에 도달하거나 예외가 발생하면 디버거에서 프로그램 실행을 중단합니다. 자세한 내용은 예외 처리를 참조하십시오. 언제든지 수동으로 실행을 중단할 수 있습니다. 해당하는 소스가 없는 코드를 실행하는 중에 중단할 경우 디스어셈블리 창에서 디버깅할 수 있습니다.
수동으로 프로그램 실행을 중단하려면
여러 프로그램을 디버깅할 때 중단 동작을 변경하려면
한 단계씩 코드 실행 개요
------------------------------
가장 일반적인 디버깅 절차 중 하나는 단계별 실행입니다. 단계별 실행은 한 번에 한 줄씩 코드를 실행합니다.
디버그 메뉴에는 단계별 코드 실행에 사용하는 세 가지 명령이 있습니다.
한 단계씩 코드 실행과 프로시저 단위 실행은 함수 호출 처리 방법만 다릅니다. 두 가지 명령 모두 디버거에서 다음 코드 줄을 실행하도록 지시합니다. 코드 줄에 함수 호출이 포함되어 있는 경우 한 단계씩 코드 실행은 호출 자체만 실행한 다음 함수 안에 있는 코드의 첫째 줄에서 중단합니다. 프로시저 단위 실행은 전체 함수를 실행한 다음 함수 외부의 첫째 줄에서 중단합니다. 함수 호출 내부를 확인하려면 한 단계씩 코드 실행을 사용합니다. 함수를 한 단계씩 실행하지 않으려면 프로시저 단위 실행을 사용합니다.
중첩된 함수 호출인 경우 한 단계씩 코드 실행 명령은 가장 안쪽에 중첩된 함수를 한 단계씩 실행합니다. Func1(Func2())와 같은 호출에 한 단계씩 코드 실행을 사용하면 디버거에서 함수 Func2를 한 단계씩 실행합니다.
중첩된 특정 함수를 한 단계씩 실행하려면 바로 가기 메뉴의 한 단계씩 코드 실행 명령을 사용합니다. 자세한 내용은 방법: 특정 함수의 코드를 한 단계씩 실행을 참조하십시오.
함수 호출 내부에서 호출한 함수로 돌아가려면 프로시저 나가기를 사용합니다. 프로시저 나가기는 함수가 반환될 때까지 코드 실행을 계속한 다음 호출 함수의 반환점에서 중단합니다.
방법: 한 단계씩 코드 실행
응용 프로그램 실행 중에는 단계별 실행 명령을 사용할 수 없습니다. 단계별 실행 명령은 중단 모드에 있거나 응용 프로그램을 시작하기 전에만 유효합니다. 자세한 내용은 실행 중단을 참조하십시오.
아직 단계별로 실행되지 않은 프로그램 코드를 한 단계씩 실행하려면
방법: 특정 함수의 코드를 한 단계씩 실행
중첩된 함수 호출 코드를 한 단계씩 실행하는 경우 바로 가기 메뉴에 있는 한 단계씩 코드 실행을 사용하여 한 단계씩 코드를 실행할 함수를 선택할 수 있습니다. 예를 들어, Func1(Func2()) 호출에서 Func1 또는 Func2 중 한 단계씩 코드를 실행할 함수를 선택할 수 있습니다. 이 명령은 모든 수의 중첩 수준에 대하여 작동합니다.
이전 Visual Studio 버전에서는 네이티브 코드에서만 이 기능을 사용할 수 있었지만 In the most recent version, stepping into a specific function works for both managed and native code. However, it does not work for stepping between managed and native code.
네이티브 코드에서 가상 함수에 대해서는 한 단계씩 코드 실행 기능을 사용할 수 없습니다.
관리 코드에서는 옵션 대화 상자에서 속성과 연산자에 대한 단계별 실행을 해제한 경우에도 한 단계씩 코드 실행을 사용하여 속성과 연산자를 한 단계씩 실행할 수 있습니다.
관리 코드에서 특정 함수를 한 단계씩 실행하려면 내 코드만을 해제해야 합니다. 한 단계씩 코드 실행을 사용할 때 사용자 코드가 아닌 함수를 선택하면 함수가 사용자 코드가 아니므로 내 코드만을 해제할지 묻는 대화 상자가 표시됩니다. 내 코드만을 해제하도록 선택하면 디버거는 선택한 함수를 한 단계씩 실행합니다. 내 코드만을 해제하지 않도록 선택하면 디버거는 이 함수를 건너뜁니다.
한 단계씩 특정 함수 코드를 실행하려면
한 단계씩 코드 실행 명령을 사용하면 속성 및 연산자를 자동으로 한 단계씩 실행하는 기능이 해제된 경우에도 속성이나 연산자를 한 단계씩 실행할 수 있습니다. 한 단계씩 코드 실행 명령에 대한 자세한 내용은 방법: 특정 함수의 코드를 한 단계씩 실행을 참조하십시오.
속성 및 연산자를 한 단계씩 실행하려면
속성 및 연산자를 한 단계씩 실행하지 않으려면
방법: 내 코드만 한 단계씩 실행
디버깅하는 동안 사용자가 작성한 코드만 확인하고 시스템 호출 등의 다른 코드는 무시할 수 있습니다. 이렇게 하려면 내 코드만 디버깅 옵션을 사용합니다. 내 코드만 옵션을 사용하면 사용자가 작성하지 않은 코드는 디버거 창에 표시되지 않도록 숨겨집니다. 단계별로 실행할 때 디버거에서는 사용자가 작성하지 않은 코드도 실행하지만 이 단계에서는 실행을 중단하지 않습니다.
내 코드만 기능에서는 DBG 파일, PDB 파일 및 최적화라는 세 가지 기준으로 사용자 코드와 사용자가 작성하지 않은 코드가 구별됩니다.
표준 디버그 빌드에서는 최적화가 해제되고 모든 모듈에 대해 디버그 기호가 만들어집니다. 사용자가 디버그 빌드를 실행할 때 이러한 모듈은 사용자 코드로 간주됩니다. 그러나 최적화되어 있고 디버그 기호가 없는 라이브러리 함수를 호출하면 이 함수는 사용자 코드로 간주되지 않습니다. 내 코드만 기능을 사용하면 라이브러리 코드의 중단점에서는 실행이 중단되지 않습니다. 일반적으로 라이브러리 코드는 디버깅 대상이 아닙니다. 중단점 창에서 이러한 중단점은 해제된 중단점 아이콘으로 표시됩니다.
모든 코드를 표시하고 모든 중단점에서 실행을 중단하려면 옵션 대화 상자를 사용하여 내 코드만 디버깅 옵션을 해제합니다.
디버거에서 내 코드로 간주할 코드를 결정하는 세 가지 특성도 있습니다. DebuggerNonUserCodeAttribute가 적용된 코드는 디버거에서 내 코드가 아닌 것으로 간주됩니다. DebuggerHiddenAttribute가 적용된 코드는 내 코드만 옵션을 해제했더라도 디버거에서 숨겨집니다. DebuggerStepThroughAttribute가 적용된 코드는 디버거에서 한 단계씩 실행되지 않고 단계별로 실행됩니다.
내 코드만 옵션을 사용하는 경우 디버그 메뉴에서 중단을 선택하고 표시할 내 코드가 없는 위치에서 실행을 중단할 수 있습니다. 이 경우 어떠한 코드도 표시되지 않습니다. 또한 단계 명령을 선택하여 다음에 나오는 "내 코드" 줄로 이동할 수 있습니다.
Visual Basic Stop 문 같은 프로그래밍 방식의 중단 문은 다르게 처리됩니다. 내 코드만 옵션을 사용하는 경우에도 이러한 문에서 항상 실행이 중단됩니다. 이 경우 사용자가 작성하지 않은 코드가 숨겨지지 않고 표시되지만 실행 위치는 사용자가 작성하지 않은 코드에서 벗어나 다음에 나오는 "내 코드" 줄까지 단계별로 진행됩니다.
참고
장치 프로젝트에 대해서는 내 코드만 옵션이 지원되지 않습니다.
내 코드만 디버깅 옵션을 설정/해제하려면
방법: 시스템 호출 한 단계씩 코드 실행
시스템 코드에 대한 디버깅 기호가 있고 내 코드만이 설정되지 않은 경우 다른 모든 호출과 마찬가지로 시스템 호출을 한 단계씩 실행할 수 있습니다.
시스템 코드에 대한 디버깅 기호가 없는 경우 다음 절차를 사용하여 Microsoft 공용 기호 서버에서 다운로드할 수 있습니다. Microsoft 공용 기호 서버에서 다운로드하려면 인터넷에 연결되어 있어야 합니다.
기호가 로드되지 않은 시스템 호출을 한 단계씩 실행하려면
방법: 지정한 위치까지 실행
------------------------------
디버깅 중에 코드의 특정 위치까지 실행한 다음 중단할 수도 있습니다. 중단하려는 위치에 중단점을 설정한 경우 다음 절차를 수행할 수 있습니다.
참고
표시되는 대화 상자와 메뉴 명령은 활성 설정이나 버전에 따라 도움말에서 설명하는 것과 다를 수 있습니다. 설정을 변경하려면 도구 메뉴에서 설정 가져오기 및 내보내기를 선택합니다. 자세한 내용은 설정에 대한 작업를 참조하십시오.
중단점을 설정한 특정 위치까지 실행하려면
방법: 커서 위치까지 실행
커서가 설정된 위치에 도달할 때까지 응용 프로그램을 실행하도록 디버거에 명령할 수 있습니다. 이 위치는 소스 창 또는 디스어셈블리 창이 될 수도 있습니다. 커서는 창을 마우스로 클릭하여 설정한 삽입 지점입니다.
소스 창에서 커서까지 실행하려면
방법: 지정한 함수까지 실행
지정한 함수에 도달할 때까지 응용 프로그램을 실행하도록 디버거에 명령할 수 있습니다. 도구 모음을 사용하여 함수 이름을 지정하거나 호출 스택에서 함수를 선택할 수 있습니다. 방법: 함수 중단점 설정을 설정하여 이 작업을 수행할 수도 있습니다.
열려 있는 소스 파일의 지정된 함수까지 실행하려면
호출 스택에 있는 함수까지 실행하려면
방법: 다음 문 설정
-----------------------
Transact-SQL 디버깅에는 이 기능을 사용할 수 없습니다.
Visual Studio 디버거에서 다음에 실행할 코드의 문으로 실행 위치를 이동할 수 있습니다. 소스 또는 디스어셈블리 창의 여백에 있는 노란색 화살표는 다음에 실행할 문의 위치를 나타냅니다. 코드의 일부를 건너뛰거나 이전에 실행한 줄로 돌아가려면 이 화살표를 이동합니다. 알려진 버그를 포함하는 코드 섹션을 건너뛰려는 경우 등에 이 방법을 사용할 수 있습니다.
주의
다음 문을 설정하면 프로그램 카운터가 새 위치로 바로 이동하게 됩니다. 이 명령은 주의해서 사용해야 합니다.
기존 실행 위치와 새 실행 위치 사이에서는 명령이 실행되지 않습니다.
실행 위치를 뒤로 이동하면 그 사이에서 실행된 명령이 실행 취소되지 않습니다.
다음 문을 다른 함수나 범위로 이동하면 호출 스택이 손상되어 런타임 오류나 예외가 발생할 수 있습니다. 다음 문을 다른 범위로 이동하려고 하면 디버거에서 대화 상자가 열리고 여기서 작업을 취소할 수 있습니다.
편집하며 계속하기를 활성화한 경우 편집하며 계속하기에서 즉시 다시 매핑할 수 없는 종류의 편집을 수행하면 다음 문 설정이 실패합니다. 예를 들어 catch 블록 내의 코드를 편집하면 이 문제가 발생합니다. 이러한 상황이 다음과 같은 오류 메시지가 표시될 때: "다음 문을 이 위치로 설정할 수 없습니다. 작업이 지원되지 않습니다. 알 수 없는 오류: 오류 번호 "
참고
관리 코드의 경우 다음과 같은 조건에서는 다음 문을 이동할 수 없습니다.
응용 프로그램을 실행하는 동안에는 다음 문을 설정할 수 없습니다. 다음에 실행할 문을 설정하려면 디버거가 중단 모드에 있어야 합니다. 자세한 내용은 실행 중단을 참조하십시오. .
다음에 실행할 문을 설정하려면
---------------------------------------------------------------
나이 50?에 프로그램에 입문합니다. 혹자는 가능하지 않으리라 여길지 모르겠습니다.
그러나 나는 생각합니다. 할. 수. 있. 다!
學而時習之 不亦說乎, 有朋自遠方來 不亦樂乎? 人不知而不溫 不亦君子乎.
(학이시습지 불역열호, 유붕자 원방래 불역 락호? 인부지 이불온 불역 군자호.)
물론, 깨달음의 경지를 얻은 공자의 말씀은 지금의 나에게는 가당치않은 상황일 것입니다만, "일신우일신"이란 뜻과 같이 항상 새로운 마음으로 또다른 내일을 향하여 마음을 다잡는다면 목표한 바가 그리 멀리있지는 않으리라 생각합니다.