다음을 통해 공유


IDiaFrameData

스택 프레임의 세부 정보를 노출합니다.

구문

IDiaFrameData : IUnknown

Vtable 순서의 메서드

다음 표에서는 IDiaFrameData 메서드를 보여 줍니다.

메서드 설명
IDiaFrameData::get_addressSection 프레임에 대한 코드 주소의 섹션 부분을 검색합니다.
IDiaFrameData::get_addressOffset 프레임에 대한 코드 주소의 오프셋 부분을 검색합니다.
IDiaFrameData::get_relativeVirtualAddress 프레임에 대한 코드의 이미지 RVA(상대 가상 주소)를 검색합니다.
IDiaFrameData::get_virtualAddress 프레임에 대한 코드의 VA(가상 주소)를 검색합니다.
IDiaFrameData::get_lengthBlock 프레임이 설명하는 코드 블록의 길이(바이트)를 검색합니다.
IDiaFrameData::get_lengthLocals 스택에 푸시된 지역 변수의 바이트 수를 검색합니다.
IDiaFrameData::get_lengthParams 스택에 푸시된 매개 변수의 바이트 수를 검색합니다.
IDiaFrameData::get_maxStack 프레임의 스택에 푸시된 최대 바이트 수를 검색합니다.
IDiaFrameData::get_lengthProlog 블록에서 프롤로그 코드의 바이트 수를 검색합니다.
IDiaFrameData::get_lengthSavedRegisters 스택에 푸시된 저장된 레지스터의 바이트 수를 검색합니다.
IDiaFrameData::get_program 현재 함수를 호출하기 전에 레지스터 세트를 컴퓨팅하는 데 사용되는 프로그램 문자열을 검색합니다.
IDiaFrameData::get_systemExceptionHandling 시스템 예외 처리가 적용 중임을 나타내는 플래그를 검색합니다.
IDiaFrameData::get_cplusplusExceptionHandling C++ 예외 처리가 적용 중임을 나타내는 플래그를 검색합니다.
IDiaFrameData::get_functionStart 블록에 함수의 진입점이 포함되어 있음을 나타내는 플래그를 검색합니다.
IDiaFrameData::get_allocatesBasePointer 이 주소 범위의 코드에 대해 기본 포인터가 할당되었음을 나타내는 플래그를 검색합니다. 이 메서드는 더 이상 사용되지 않습니다.
IDiaFrameData::get_type 컴파일러 특정 프레임 형식을 검색합니다.
IDiaFrameData::get_functionParent 프레임 데이터 인터페이스에서 바깥쪽 함수를 검색합니다.
IDiaFrameData::execute 스택 해제를 수행하고 스택 워크 프레임 인터페이스에서 레지스터의 현재 상태를 반환합니다.

설명

프레임에 사용할 수 있는 세부 정보는 주소 및 블록 길이가 나타내는 주소 범위 내 실행 지점과 관련이 있습니다.

호출자 참고 사항

IDiaEnumFrameData::Next 또는 IDiaEnumFrameData::Item 메서드를 호출하여 이 인터페이스를 가져옵니다. 자세한 내용은 IDiaEnumFrameData 인터페이스를 참조하세요.

예시

이 예제에서는 IDiaFrameData 개체의 속성을 출력합니다. IDiaFrameData 인터페이스를 가져오는 방법의 예제는 IDiaEnumFrameData 인터페이스를 참조하세요.

void PrintFrameData(IDiaFrameData* pFrameData){
    DWORD dwSect;
    DWORD dwOffset;
    DWORD cbBlock;
    DWORD cbLocals; // Number of bytes reserved for the function locals
    DWORD cbParams; // Number of bytes reserved for the function arguments
    DWORD cbMaxStack;
    DWORD cbProlog;
    DWORD cbSavedRegs;
    BOOL  bSEH;
    BOOL  bEH;
    BOOL  bStart;
    BSTR  wszProgram;

    if(pFrameData->get_addressSection(&dwSect) == S_OK &&
       pFrameData->get_addressOffset(&dwOffset) == S_OK &&
       pFrameData->get_lengthBlock(&cbBlock) == S_OK &&
       pFrameData->get_lengthLocals(&cbLocals) == S_OK &&
       pFrameData->get_lengthParams(&cbParams) == S_OK &&
       pFrameData->get_maxStack(&cbMaxStack) == S_OK &&
       pFrameData->get_lengthProlog(&cbProlog) == S_OK &&
       pFrameData->get_lengthSavedRegisters(&cbSavedRegs) == S_OK &&
       pFrameData->get_systemExceptionHandling(&bSEH) == S_OK &&
       pFrameData->get_cplusplusExceptionHandling(&bEH) == S_OK &&
       pFrameData->get_functionStart(&bStart) == S_OK )
    {
        wprintf(L"Frame address  : %04X:%08X\n", dwSect, dwOffset);
        wprintf(L"Block size     : 0x%8X\n", cbBlock);
        wprintf(L"Locals size    : 0x%8X\n", cbLocals);
        wprintf(L"Parms size     : 0x%8X\n", cbParams);
        wprintf(L"Max stack used : 0x%8X\n", cbMaxStack);
        wprintf(L"Prolog size    : 0x%8X\n", cbProlog);
        wprintf(L"Saved regs size: 0x%8X\n", cbSavedRegs);
        wprintf(L"System Exception Handling: %c\n", bSEH ? L'Y' : L'N');
        wprintf(L"C++ Exception Handling   : %c\n", bEH ? L'Y' : L'N');
        wprintf(L"Function starts in block : %c\n", bStart ? L'Y' : L'N');

        if (pFrameData->get_program(&wszProgram) == S_OK)
        {
            wprintf(L"Program used for register set: %s\n", wszProgram);
            SysFreeString(wszProgram);
        }
        else
        {
            wprintf(L"\n");
        }
    }
}

요구 사항

헤더: Dia2.h

라이브러리: diaguids.lib

DLL: msdia80.dll

참고 항목