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::NextIDiaEnumFrameData::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

另请参阅