From fba83511b07fadc83ffd4d624d4dc1d4f4ec553b Mon Sep 17 00:00:00 2001 From: "SND\\kernelnet_cp" Date: Tue, 10 Apr 2012 06:35:39 +0000 Subject: [PATCH] [0.1.x] fixed : issue #10627 ( print typeInfo() output insufficient information ) git-svn-id: https://pykd.svn.codeplex.com/svn@75403 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/typeinfo.cpp | 47 +++++++++++++++++++++++++++++++++++++++++++++++ pykd/typeinfo.h | 4 ++++ 2 files changed, 51 insertions(+) diff --git a/pykd/typeinfo.cpp b/pykd/typeinfo.cpp index c364d36..3196af4 100644 --- a/pykd/typeinfo.cpp +++ b/pykd/typeinfo.cpp @@ -1,5 +1,7 @@ #include "stdafx.h" +#include + #include "typeinfo.h" #include "dbgclient.h" @@ -536,6 +538,29 @@ ULONG UdtTypeInfo::getFieldCount() ///////////////////////////////////////////////////////////////////////////////////// +std::string UdtTypeInfo::print() +{ + std::stringstream sstr; + + sstr << "struct/class: " << getName() << "Size: 0x" << std::hex << getSize() << " (" << std::dec << getSize() << ")" << std::endl; + + ULONG fieldCount = getFieldCount(); + + for ( ULONG i = 0; i < fieldCount; ++i ) + { + TypeInfoPtr fieldType = getFieldByIndex(i); + + sstr << " +" << std::right << std::setw(4) << std::setfill('0') << std::hex << fieldType->getOffset(); + sstr << " " << std::left << std::setw( 20 ) << std::setfill(' ') << getFieldNameByIndex(i) << ':'; + sstr << " " << std::left << fieldType->getName(); + sstr << std::endl; + } + + return sstr.str(); +} + +///////////////////////////////////////////////////////////////////////////////////// + bool UdtTypeInfo::getBaseField( pyDia::SymbolPtr symUdt, @@ -652,6 +677,28 @@ python::dict EnumTypeInfo::asMap() return dct; } +///////////////////////////////////////////////////////////////////////////////////// + +std::string EnumTypeInfo::print() +{ + std::stringstream sstr; + + sstr << "enum: " << getName() << std::endl; + + pyDia::SymbolPtrList symbolsList = m_dia->findChildrenImpl(SymTagData, "", nsfCaseSensitive ); + + for ( pyDia::SymbolPtrList::iterator it = symbolsList.begin(); it != symbolsList.end(); it++ ) + { + CComVariant val; + (*it)->getValue( val ); + + sstr << " " << (*it)->getName(); + sstr << " = " << std::hex << val.ulVal << " (" << std::dec << val.ulVal << ')'; + sstr << std::endl; + } + + return sstr.str(); +} ///////////////////////////////////////////////////////////////////////////////////// diff --git a/pykd/typeinfo.h b/pykd/typeinfo.h index 7603270..dce1066 100644 --- a/pykd/typeinfo.h +++ b/pykd/typeinfo.h @@ -242,6 +242,8 @@ protected: return true; } + virtual std::string print(); + static bool getBaseField( pyDia::SymbolPtr symUdt, const std::string &fieldName, @@ -287,6 +289,8 @@ protected: return true; } + virtual std::string print(); + pyDia::SymbolPtr m_dia; };