diff --git a/pykd/typedvar.cpp b/pykd/typedvar.cpp index 1c0a298..c0343d9 100644 --- a/pykd/typedvar.cpp +++ b/pykd/typedvar.cpp @@ -259,15 +259,16 @@ std::string UdtTypedVar::print() if ( fieldType->getStaticOffset() != 0 ) fieldVar = TypedVar::getTypedVar( m_client, fieldType, VarDataMemory::factory(m_dataSpaces, fieldType->getStaticOffset() ) ); - sstr << " =" << std::right << std::setw(4) << std::setfill('0') << std::hex << fieldType->getStaticOffset(); + sstr << " =" << std::right << std::setw(10) << std::setfill('0') << std::hex << fieldType->getStaticOffset(); + sstr << " " << std::left << std::setw(18) << std::setfill(' ') << m_typeInfo->getFieldNameByIndex(i) << ':'; } else { fieldVar = TypedVar::getTypedVar( m_client, fieldType, m_varData->fork(fieldType->getOffset()) ); sstr << " +" << std::right << std::setw(4) << std::setfill('0') << std::hex << fieldType->getOffset(); + sstr << " " << std::left << std::setw(24) << std::setfill(' ') << m_typeInfo->getFieldNameByIndex(i) << ':'; } - sstr << " " << std::left << std::setw( 20 ) << std::setfill(' ') << m_typeInfo->getFieldNameByIndex(i) << ':'; sstr << " " << std::left << fieldType->getName(); if ( fieldVar ) diff --git a/pykd/typeinfo.cpp b/pykd/typeinfo.cpp index 1230727..97935a9 100644 --- a/pykd/typeinfo.cpp +++ b/pykd/typeinfo.cpp @@ -31,10 +31,12 @@ TypeInfoPtr TypeInfo::getTypeInfo( pyDia::SymbolPtr &typeSym ) case SymTagArrayType: return TypeInfoPtr( new ArrayTypeInfo( typeSym ) ); - case SymTagPointerType: - case SymTagVTable: + case SymTagPointerType: return TypeInfoPtr( new PointerTypeInfo( typeSym ) ); + case SymTagVTable: + return TypeInfoPtr( new PointerTypeInfo( typeSym->getType() ) ); + case SymTagEnum: return TypeInfoPtr( new EnumTypeInfo( typeSym ) ); @@ -230,7 +232,7 @@ BitFieldTypeInfo::BitFieldTypeInfo( pyDia::SymbolPtr &symbol ) m_name = sstr.str(); } -///////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////// PointerTypeInfo::PointerTypeInfo( pyDia::SymbolPtr &symbol ) { @@ -261,7 +263,7 @@ PointerTypeInfo::PointerTypeInfo( pyDia::SymbolPtr &symbol ) break; case SymTagVTableShape: - m_derefName = "VTable"; + m_derefName = "VTable"; break; } } @@ -478,11 +480,11 @@ TypeInfoPtr UdtTypeInfo::getField( const std::string &fieldName ) if ( m_fields.empty() ) getFields( m_dia ); - FieldList::iterator it; + FieldList::reverse_iterator it; - it = std::find_if( m_fields.begin(), m_fields.end(), boost::bind( &FieldType::first, _1) == fieldName ); + it = std::find_if( m_fields.rbegin(), m_fields.rend(), boost::bind( &FieldType::first, _1) == fieldName ); - if ( it == m_fields.end() ) + if ( it == m_fields.rend() ) throw TypeException( m_dia->getName(), fieldName + ": unknown field type" ); return it->second; @@ -552,6 +554,13 @@ void UdtTypeInfo::getFields( pyDia::SymbolPtr &rootSym, ULONG startOffset ) m_fields.push_back( std::make_pair( childSym->getName(), ti ) ); } + else + if ( symTag == SymTagVTable ) + { + TypeInfoPtr ti = TypeInfo::getTypeInfo( m_dia, childSym ); + + m_fields.push_back( std::make_pair( "__VFN_table", ti ) ); + } } } @@ -571,14 +580,15 @@ std::string UdtTypeInfo::print() if ( fieldType->isStaticMember() ) { - sstr << " =" << std::right << std::setw(4) << std::setfill('0') << std::hex << fieldType->getStaticOffset(); + sstr << " =" << std::right << std::setw(10) << std::setfill('0') << std::hex << fieldType->getStaticOffset(); + sstr << " " << std::left << std::setw(18) << std::setfill(' ') << getFieldNameByIndex(i) << ':'; } else { sstr << " +" << std::right << std::setw(4) << std::setfill('0') << std::hex << fieldType->getOffset(); + sstr << " " << std::left << std::setw(24) << std::setfill(' ') << getFieldNameByIndex(i) << ':'; } - sstr << " " << std::left << std::setw( 20 ) << std::setfill(' ') << getFieldNameByIndex(i) << ':'; sstr << " " << std::left << fieldType->getName(); sstr << std::endl; }