다음을 통해 공유


범위 및 기호 그룹

기호 그룹에는 그룹으로 효율적으로 조작할 수 있는 기호 집합이 포함되어 있습니다. 기호 그룹을 수동으로 만들고 채울 수도 있고, 지역 변수 및 함수 인수와 같은 어휘 범위의 기호에 따라 자동으로 생성 및 업데이트될 수 있습니다. IDebugSymbolGroup 인터페이스는 기호 그룹을 나타내는 데 사용됩니다.

기호 그룹을 만드는 방법에는 두 가지가 있습니다. 빈 기호 그룹은 CreateSymbolGroup에서 반환되고 현재 어휘 scope 대한 기호 그룹은 GetScopeSymbolGroup에서 반환됩니다.

참고 현재 scope 생성된 기호 그룹은 지역 변수의 스냅샷. 대상에서 실행이 발생하면 기호가 더 이상 정확하지 않을 수 있습니다. 또한 현재 scope 변경되면 기호 그룹은 더 이상 현재 scope 나타내지 않습니다(만든 scope 계속 나타내기 때문).

AddSymbol을 사용하여 기호 그룹에 기호를 추가하고 RemoveSymbolByIndex 또는 RemoveSymbolByName을 사용하여 제거할 수 있습니다. OutputAsType 메서드는 디버거에게 기호의 데이터를 처리할 때 다른 기호 형식을 사용하도록 지시합니다.

참고 범위가 지정된 기호의 값이 정확하지 않을 수 있습니다. 특히 머신 아키텍처 및 컴파일러 최적화로 인해 디버거가 기호의 값을 정확하게 결정하지 못할 수 있습니다.

기호 항목 정보는 해당 위치 및 형식을 포함하여 기호에 대한 설명입니다. 모듈에서 기호에 대한 이 정보를 찾으려면 IDebugSymbols3::GetSymbolEntryInformation을 사용합니다. 기호 그룹의 기호에 대한 이 정보를 찾으려면 IDebugSymbolGroup2::GetSymbolEntryInformation을 사용합니다. 기호 항목 정보에 대한 자세한 내용은 DEBUG_SYMBOL_ENTRY 참조하세요.

다음 메서드는 기호 그룹의 기호에 대한 정보를 반환합니다.

  • GetSymbolName 은 기호의 이름을 반환합니다.

  • 기호에 절대 주소가 있는 경우 GetSymbolOffset은 기호의 대상 가상 주소 공간에서 절대 주소를 반환합니다.

  • 기호가 레지스터에 포함된 경우 GetSymbolRegister는 기호가 포함된 레지스터를 반환합니다.

  • GetSymbolSize 는 기호에 대한 데이터의 크기를 반환합니다.

  • GetSymbolTypeName 은 기호 형식의 이름을 반환합니다.

  • GetSymbolValueText 는 기호 값을 문자열로 반환합니다.

기호가 레지스터 또는 디버거 엔진에 알려진 메모리 위치에 저장되는 경우 WriteSymbol을 사용하여 해당 값을 변경할 수 있습니다.

기호는 다른 기호가 포함된 경우 부모 기호입니다. 예를 들어 구조체에는 해당 멤버가 포함됩니다. 기호는 다른 기호에 포함된 경우 자식 기호입니다. 기호는 부모 기호와 자식 기호일 수 있습니다. 각 기호 그룹에는 평면 구조가 있으며 부모 기호와 자식이 포함됩니다. 각 기호에는 깊이 가 있습니다. 기호 그룹에 부모가 없는 기호의 깊이는 0이고 각 자식 기호의 깊이는 부모의 깊이보다 큽니다. 부모 기호의 자식은 기호 그룹에 있거나 없을 수 있습니다. 자식이 기호 그룹에 있으면 부모 기호를 expanded라고 합니다. 기호 그룹에서 기호의 자식을 추가하거나 제거하려면 ExpandSymbol을 사용합니다.

기호 그룹의 기호 수는 GetNumberSymbols에서 반환됩니다. 기호 그룹의 기호 인덱 스는 ID 번호입니다. 인덱스 범위는 0부터 기호 수에서 1을 뺀 값까지입니다. 기호를 기호 그룹에 추가하거나 제거할 때마다(예: 기호 확장) 기호 그룹에 있는 모든 기호의 인덱스가 변경될 수 있습니다.

부모-자식 관계에 대한 정보를 포함한 기호 매개 변수는 GetSymbolParameters를 사용하여 찾을 수 있습니다. 이 메서드는 DEBUG_SYMBOL_PARAMETERS 구조를 반환합니다.

기호 그룹의 기호는 OutputSymbols 메서드를 사용하여 디버거의 출력 스트림에 인쇄할 수 있습니다.

범위

현재 scope 또는 현재 로컬 컨텍스트는 디버거 엔진에서 노출하는 지역 변수를 결정합니다. scope 세 가지 구성 요소가 있습니다.

  1. 스택 프레임입니다.

  2. 현재 명령입니다.

  3. 레지스터 컨텍스트입니다.

스택 프레임이 호출 스택의 맨 위에 있는 경우 현재 명령은 마지막 이벤트를 발생시킨 명령입니다. 그렇지 않으면 현재 명령은 다음으로 높은 스택 프레임을 생성한 함수 호출입니다.

GetScopeSetScope 메서드를 사용하여 현재 scope 가져와 설정할 수 있습니다. 이벤트가 발생하면 현재 scope 이벤트의 scope 설정됩니다. ResetScope를 사용하여 현재 scope 마지막 이벤트의 scope 다시 설정할 수 있습니다.

스레드 컨텍스트

스레드 컨텍스트는 스레드를 전환할 때 Windows에서 유지되는 상태입니다. 레지스터 컨텍스트의 일부이지만 스레드 컨텍스트가 아닌 커널 전용 프로세서 상태가 있다는 점을 제외하면 레지스터 컨텍스트와 비슷합니다. 이 추가 상태는 커널 모드 디버깅 중에 레지스터로 사용할 수 있습니다.

스레드 컨텍스트는 ntddk.h에 정의된 CONTEXT 구조체로 표시됩니다. 이 구조는 플랫폼에 종속되며 해석은 유효 프로세서 유형에 따라 달라집니다. GetThreadContextSetThreadContext 메서드를 사용하여 스레드 컨텍스트를 가져와서 설정할 수 있습니다.