IDiaSegment

将数据从节编号映射到地址空间的段。

语法

IDiaSegment : IUnknown

Vtable 顺序中的方法

下表显示了 IDiaSegment 方法。

方法 说明
IDiaSegment::get_frame 检索段号。
IDiaSegment::get_offset 检索段中节开始的偏移量。
IDiaSegment::get_length 检索段中的字节数。
IDiaSegment::get_read 检索指示是否可以读取段的标记。
IDiaSegment::get_write 检索指示是否可以修改段的标记。
IDiaSegment::get_execute 检索指示段是否是可执行的标记。
IDiaSegment::get_addressSection 检索映射到此段的节编号。
IDiaSegment::get_relativeVirtualAddress 检索节开头的相对虚拟地址 (RVA)。
IDiaSegment::get_virtualAddress 检索节开头的虚拟地址 (VA)。

注解

由于调试接口访问 (DIA) SDK 已执行从节偏移到相对虚拟地址的转换,因此大多数应用程序不会使用段映射中的信息。

对调用者的说明

通过调用 IDiaEnumSegments::ItemIDiaEnumSegments::Next 方法获取此接口。 参阅示例了解详细信息。

示例

此函数显示表中所有段的地址和最近符号。

void ShowSegments(IDiaTable *pTable, IDiaSession *pSession)
{
    CComPtr<IDiaEnumSegments> pSegments;
    if ( SUCCEEDED( pTable->QueryInterface(
                                _uuidof( IDiaEnumSegments ),
                               (void**)&pSegments )
                  )
       )
    {
        CComPtr<IDiaSegment> pSegment;
        while ( SUCCEEDED( hr = pSegments->Next( 1, &pSegment, &celt ) ) &&
                celt == 1 )
        {
            DWORD rva;
            DWORD seg;

            pSegment->get_addressSection( &seg );
            if ( pSegment->get_relativeVirtualAddress( &rva ) == S_OK )
            {
                printf( "Segment %i addr: 0x%.8X\n", seg, rva );
                pSegment = NULL;

                CComPtr<IDiaSymbol> pSym;
                if ( psession->findSymbolByRVA( rva, SymTagNull, &pSym ) == S_OK )
                {
                    CDiaBSTR name;
                    DWORD    tag;

                    pSym->get_symTag( &tag );
                    pSym->get_name( &name );
                    printf( "\tClosest symbol: %ws (%ws)\n",
                            name != NULL ? name : L"",
                            szTags[ tag ] );
                }
            }
        }
    }
}

要求

标头:Dia2.h

库:diaguids.lib

DLL:msdia80.dll

另请参阅