다음을 통해 공유


디버깅 중 프로그램 검사

디버깅 중에 프로그램을 검사하려면 디버거에서 관리되는 스택 프레임에 액세스하고 식을 계산할 수 있어야 합니다. 다음 단원에서는 디버거에서 CLR(공용 언어 런타임) 디버깅 API를 사용하여 이러한 작업을 수행하는 방법에 대해 설명합니다.

호출 스택 액세스

다음 목록에서는 디버거에서 관리되는 스택 프레임에 액세스하는 방법을 단계별로 설명합니다. 스택 프레임에 액세스하려면 디버기 프로세스를 중지해야 합니다.

  1. 디버거에서 스택 체인에 대한 열거자를 가져옵니다. 디버거에서 액세스할 스택 체인의 스레드에 대해 ICorDebugThread::EnumerateChains 메서드를 호출하여 스택 체인을 열거하기 위한 ICorDebugChainEnum 개체를 가져옵니다.

  2. 디버거에서 ICorDebugChainEnum::Next 메서드를 호출하여 스택 체인을 반복합니다.

  3. 디버거에서 ICorDebugChain::EnumerateFrames 메서드를 호출하여 체인의 스택 프레임에 대한 열거자를 가져옵니다.

  4. 디버거에서 ICorDebugFrameEnum::Next 메서드를 호출하여 스택 프레임을 계속 반복합니다.

  5. 선택적으로 디버거에서 IP 주소를 가져올 수 있습니다. 디버거에서 ICorDebugILFrame::GetIP 메서드를 호출하여 스택 프레임에 대한 함수의 시작 위치를 기준으로 IP 주소를 가져옵니다.

  6. 선택적으로 디버거에서 스택 프레임에 대한 다른 정보를 가져올 수도 있습니다. 예를 들어 디버거에서 ICorDebugFrame::GetFunctionToken 메서드를 호출하여 스택 프레임에서 실행하고 있는 코드의 함수에 대한 메타데이터 토큰을 가져올 수 있습니다. 또한 디버거에서 ICorDebugCode::GetCode 메서드를 호출하여 스택 프레임에서 실행하고 있는 코드를 나타내는 개체를 가져올 수 있습니다.

식 계산

비관리 네이티브 코드의 식은 기존의 디버거에서 사용하는 동일한 메커니즘을 사용하여 계산할 수 있습니다.

관리 코드의 경우 디버거에서는 다음과 같이 식을 계산할 수 있습니다.

  • 식을 구문 분석합니다.

  • 디버깅 API를 호출하여 식의 변수 값에 액세스하고 식의 함수를 호출합니다.

또는 디버거에서 다음을 수행할 수 있습니다.

  • 식을 전역 함수에 래핑하고 함수를 컴파일합니다.

  • 디버깅 API(편집하여 계속하기)를 호출하여 전역 함수를 추가합니다.

  • 디버깅 API를 호출하여 함수를 함수를 실행합니다.

다음 목록에서는 디버거에서 식을 계산하는 방법을 단계별로 설명합니다. 이 시나리오의 경우 식은 A + MyFunc()이고 여기서 A는 레지스트리에 있는 것으로 가정하며 디버깅되는 코드는 관리 네이티브 코드입니다.

  1. 디버거에서 A 값을 가져옵니다. 디버거에서 식을 계산할 스택 프레임에 대해 ICorDebugNativeFrame::GetLocalRegisterValue 메서드를 호출합니다.

  2. 디버거에서 식을 계산할 스레드에 대해 ICorDebugThread::CreateEval 메서드를 호출하여 계산 개체를 만듭니다.

  3. 디버거에서 ICorDebugEval::CallFunction 메서드를 호출하여 MyFunc() 값을 계산합니다.

  4. 디버거에서 식을 계산합니다. 디버거에서 이전 두 단계에서 가져온 값을 사용하여 식에 상수 정리를 적용합니다.

참고 항목

개념

CLR 디버깅 개요

기타 리소스

디버깅(관리되지 않는 API 참조)