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