다음을 통해 공유


실행 제어

디버그 엔진(DE)은 일반적으로 다음 이벤트 중 하나를 마지막 시작 이벤트로 보냅니다.

  • 새로 시작된 프로그램에 연결하는 경우 진입점 이벤트

  • 이미 실행 중인 프로그램에 연결하는 경우 로드 완료 이벤트

    이러한 이벤트는 모두 이벤트를 중지하므로 DE는 IDE를 통해 사용자의 응답을 기다립니다. 자세한 내용은 운영 모드를 참조하세요.

이벤트 중지

중지 이벤트가 디버그 세션으로 전송되는 경우:

  1. 현재 명령 포인터가 포함된 프로그램 및 스레드는 이벤트 인터페이스에서 가져올 수 있습니다.

  2. IDE는 편집기에서 강조 표시된 대로 표시되는 현재 소스 코드 파일과 위치를 결정합니다.

  3. 디버그 세션은 일반적으로 프로그램의 Continue 메서드를 호출하여 이 첫 번째 중지 이벤트에 응답합니다.

  4. 프로그램은 중단점을 만나거나 중지 조건이 발생할 때까지 실행됩니다. 이 경우 DE는 중단점 이벤트를 디버그 세션으로 보냅니다. 중단점 이벤트는 중지 이벤트이며 DE는 다시 사용자 응답을 기다립니다.

  5. 사용자가 함수를 한 단계씩 실행, 실행 또는 중단하도록 선택하면 IDE는 디버그 세션에 프로그램의 Step 메서드를 호출하라는 메시지를 표시합니다. 그런 다음, IDE는 단계의 단위(명령, 문 또는 줄)와 단계의 유형(함수에 들어가기, 넘어서기, 또는 벗어나기)을 전달합니다. 단계가 완료되면 DE는 단계 완료 이벤트를 디버그 세션(중지 이벤트)으로 보냅니다.

    -또는-

    사용자가 현재 명령 포인터에서 실행을 계속하도록 선택하면 IDE는 디버그 세션에 프로그램의 Execute 메서드를 호출하라는 메시지를 표시합니다. 프로그램은 다음 중지 조건이 발생할 때까지 실행을 다시 시작합니다.

    -또는-

    디버그 세션이 특정 중지 이벤트를 무시하는 경우 디버그 세션은 프로그램의 Continue 메서드를 호출합니다. 프로그램이 중지 조건에 도달할 때 함수 안으로 들어가거나, 함수 위를 넘어가거나, 함수 밖으로 나가는 단계에 있었다면, 계속해서 해당 단계를 수행합니다.

    프로그래밍 방식으로 DE에서 중지 조건이 발견되면 IDebugLoadCompleteEvent2 또는 IDebugEntryPointEvent2와 같은 중지 이벤트를 IDebugEventCallback2 인터페이스를 통해 SDM(세션 디버그 관리자)에 보냅니다. DE는 현재 명령 포인터를 포함하는 프로그램 및 스레드를 나타내는 IDebugProgram2IDebugThread2 인터페이스를 전달합니다. SDM은 IDebugThread2::EnumFrameInfo 를 호출하여 최상위 스택 프레임을 얻고 IDebugStackFrame2::GetDocumentContext 를 호출하여 현재 명령 포인터와 연결된 문서 컨텍스트를 가져옵니다. 이 문서 컨텍스트는 일반적으로 소스 코드 파일 이름, 줄 및 열 번호입니다. IDE는 이를 사용하여 현재 명령 포인터가 포함된 소스 코드를 강조 표시합니다.

    SDM은 일반적으로 IDebugProgram2::Continue를 호출하여 이 첫 번째 중지 이벤트에 응답합니다. 그런 다음 중단점을 치는 것과 같은 중지 조건이 발생할 때까지 프로그램을 실행합니다. 이 경우 DE는 IDebugBreakpointEvent2 인터페이스 를 SDM에 보냅니다. 중단점 이벤트는 중지 이벤트이며 DE는 다시 사용자 응답을 기다립니다.

    사용자가 함수를 한 단계씩 실행, 실행 또는 해제하도록 선택하면 IDE는 SDM에 IDebugProgram2::Step을 호출하라는 메시지를 표시합니다. 그런 다음, IDE는 STEPUNIT (명령문, 문 또는 줄) 및 STEPKIND, 즉 함수를 하나하나 들어가거나(step into), 건너뛰거나(step over), 벗어나기(step out) 중 어떤 식으로 실행할지를 결정하는 요소를 전달합니다. 단계가 완료되면 DE는 중지 이벤트인 SDM에 IDebugStepCompleteEvent2 인터페이스를 보냅니다.

    사용자가 현재 명령 포인터에서 계속 실행하도록 선택하면 IDE는 SDM에 IDebugProgram2::Execute를 호출하도록 요청합니다. 프로그램은 다음 중지 조건이 발생할 때까지 실행을 다시 시작합니다.

    디버그 패키지가 특정 중지 이벤트를 무시하는 경우 디버그 패키지는 IDebugProgram2::Continue를 호출하는 SDM을 호출합니다. 프로그램이 중지 조건에 도달했을 때 함수에 들어가거나, 넘거나, 빠져 나가는 중이었다면, 단계를 계속 진행합니다. 이는 프로그램이 단계별 상태를 유지하여 계속하는 방법을 알 수 있음을 의미합니다.

    SDM이 Step에, 실행, 그리고 계속에 대해 만드는 호출은 비동기적입니다. 이는 곧 SDM이 호출의 신속한 반환을 기대한다는 의미입니다. DE가 Step, Execute, 또는 Continue가 반환되기 전에 동일한 스레드에서 SDM에 중지 이벤트를 전송하면, SDM은 응답을 중지합니다.