From e3900c02a58f9b582f13e839be1c4efa5bccccf0 Mon Sep 17 00:00:00 2001 From: "SND\\kernelnet_cp" Date: Fri, 18 Nov 2011 17:20:23 +0000 Subject: [PATCH] [0.1.x] updated : typedVar git-svn-id: https://pykd.svn.codeplex.com/svn@71478 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/dbgext.cpp | 4 +-- pykd/module.cpp | 16 +++++----- pykd/module.h | 8 ++--- pykd/typedvar.cpp | 61 +++++++----------------------------- pykd/typedvar.h | 30 +++++++++++------- pykd/typeinfo.h | 14 +++++++-- test/scripts/pykdtest.py | 4 +-- test/scripts/typedvar.py | 10 +++++- test/targetapp/targetapp.cpp | 1 + 9 files changed, 67 insertions(+), 81 deletions(-) diff --git a/pykd/dbgext.cpp b/pykd/dbgext.cpp index 836ac12..0d16233 100644 --- a/pykd/dbgext.cpp +++ b/pykd/dbgext.cpp @@ -372,10 +372,10 @@ BOOST_PYTHON_MODULE( pykd ) .def( "field", &pykd::TypeInfo::getField ) .def( "__getattr__", &pykd::TypeInfo::getField ); - python::class_ >("typedVar", + python::class_, boost::noncopyable >("typedVar", "Class of non-primitive type object, child class of typeClass. Data from target is copied into object instance", python::no_init ) - .def( python::init() ) + //.def( python::init() ) .def("getAddress", &TypedVar::getAddress, "Return virtual address" ) .def("sizeof", &TypedVar::getSize, diff --git a/pykd/module.cpp b/pykd/module.cpp index 5052306..65fec4b 100644 --- a/pykd/module.cpp +++ b/pykd/module.cpp @@ -153,33 +153,33 @@ Module::reloadSymbols() /////////////////////////////////////////////////////////////////////////////////// -TypedVar +TypedVarPtr Module::getTypedVarByTypeName( const std::string &typeName, ULONG64 addr ) { - return TypedVar( getTypeByName(typeName), addr ); + return TypedVar::getTypedVar( m_client, getTypeByName(typeName), addr ); } /////////////////////////////////////////////////////////////////////////////////// -TypedVar +TypedVarPtr Module::getTypedVarByType( const TypeInfoPtr &typeInfo, ULONG64 addr ) { - return TypedVar( typeInfo, addr ); + return TypedVar::getTypedVar( m_client, typeInfo, addr ); } /////////////////////////////////////////////////////////////////////////////////// -TypedVar +TypedVarPtr Module::getTypedVarByName( const std::string &symName ) { pyDia::SymbolPtr typeSym = getDia()->getChildByName( symName ); - return TypedVar( TypeInfo::getTypeInfo( typeSym->getType() ), typeSym->getRva() + m_base ); + return TypedVar::getTypedVar( m_client, TypeInfo::getTypeInfo( typeSym->getType() ), typeSym->getRva() + m_base ); } /////////////////////////////////////////////////////////////////////////////////// -TypedVar +TypedVarPtr Module::getTypedVarByAddr( ULONG64 addr ) { addr = addr64(addr); @@ -193,7 +193,7 @@ Module::getTypedVarByAddr( ULONG64 addr ) if (displacement) throw DbgException( "not exactly match by RVA" ); - return TypedVar( TypeInfo::getTypeInfo( diaSym->getType() ), addr ); + return TypedVar::getTypedVar( m_client, TypeInfo::getTypeInfo( diaSym->getType() ), addr ); } /////////////////////////////////////////////////////////////////////////////////// diff --git a/pykd/module.h b/pykd/module.h index a18b418..414325b 100644 --- a/pykd/module.h +++ b/pykd/module.h @@ -63,13 +63,13 @@ public: return TypeInfo::getTypeInfo( boost::static_pointer_cast( getDia() ), typeName); } - TypedVar getTypedVarByTypeName( const std::string &typeName, ULONG64 addr ); + TypedVarPtr getTypedVarByTypeName( const std::string &typeName, ULONG64 addr ); - TypedVar getTypedVarByType( const TypeInfoPtr &typeInfo, ULONG64 addr ); + TypedVarPtr getTypedVarByType( const TypeInfoPtr &typeInfo, ULONG64 addr ); - TypedVar getTypedVarByAddr( ULONG64 addr ); + TypedVarPtr getTypedVarByAddr( ULONG64 addr ); - TypedVar getTypedVarByName( const std::string &symName ); + TypedVarPtr getTypedVarByName( const std::string &symName ); private: diff --git a/pykd/typedvar.cpp b/pykd/typedvar.cpp index e47eb24..50bc00b 100644 --- a/pykd/typedvar.cpp +++ b/pykd/typedvar.cpp @@ -31,7 +31,7 @@ TypedVarPtr TypedVar::getTypedVar( IDebugClient4 *client, const TypeInfoPtr& t if ( typeInfo->isUserDefined() ) { - tv.reset( new TypedVar( client, typeInfo, offset ) ); + tv.reset( new UdtTypedVar( client, typeInfo, offset ) ); return tv; } @@ -49,55 +49,6 @@ TypedVar::TypedVar ( IDebugClient4 *client, const TypeInfoPtr& typeInfo, ULONG64 { m_size = m_typeInfo->getSize(); } - -/////////////////////////////////////////////////////////////////////////////////// - -TypedVar::TypedVar( const TypeInfoPtr& typeInfo, ULONG64 offset ) : - DbgObject( g_dbgClient->client() ), - m_typeInfo( typeInfo ), - m_offset( offset ) -{ - m_size = m_typeInfo->getSize(); -} - -/////////////////////////////////////////////////////////////////////////////////// - -TypedVarPtr -TypedVar::getField( const std::string &fieldName ) -{ - TypeInfoPtr fieldType = m_typeInfo->getField( fieldName ); - - TypedVarPtr tv; - - if ( fieldType->isBasicType() ) - { - tv.reset( new BasicTypedVar( m_client, fieldType, m_offset + fieldType->getOffset() ) ); - return tv; - } - - if ( fieldType->isPointer() ) - { - tv.reset( new PtrTypedVar( m_client, fieldType, m_offset + fieldType->getOffset() ) ); - return tv; - } - - if ( fieldType->isArray() ) - { - tv.reset( new ArrayTypedVar( m_client, fieldType, m_offset + fieldType->getOffset() ) ); - return tv; - } - - if ( fieldType->isUserDefined() ) - { - tv.reset( new TypedVar( m_client, fieldType, m_offset + fieldType->getOffset() ) ); - return tv; - } - - throw DbgException( "can not get field" ); - - return tv; -} - /////////////////////////////////////////////////////////////////////////////////// ULONG64 @@ -131,4 +82,14 @@ PtrTypedVar::getValue() const /////////////////////////////////////////////////////////////////////////////////// +TypedVarPtr +UdtTypedVar::getField( const std::string &fieldName ) +{ + TypeInfoPtr fieldType = m_typeInfo->getField( fieldName ); + + return TypedVar::getTypedVar( m_client, fieldType, m_offset + fieldType->getOffset() ); +} + +/////////////////////////////////////////////////////////////////////////////////// + } // end pykd namespace \ No newline at end of file diff --git a/pykd/typedvar.h b/pykd/typedvar.h index e381672..edb6405 100644 --- a/pykd/typedvar.h +++ b/pykd/typedvar.h @@ -20,11 +20,6 @@ public: static TypedVarPtr getTypedVar( IDebugClient4 *client, const TypeInfoPtr& typeInfo, ULONG64 offset ); - TypedVar ( const TypeInfoPtr& typeInfo, ULONG64 offset ); - - - TypedVar ( IDebugClient4 *client, const TypeInfoPtr& typeInfo, ULONG64 offset ); - ULONG64 getAddress() const { return m_offset; } @@ -42,7 +37,9 @@ public: return m_typeInfo; } - virtual TypedVarPtr getField( const std::string &fieldName ); + virtual TypedVarPtr getField( const std::string &fieldName ) { + throw DbgException("no fields"); + } virtual std::string print() { return "TypeVar"; @@ -58,6 +55,10 @@ public: protected: + //TypedVar ( const TypeInfoPtr& typeInfo, ULONG64 offset ); + + TypedVar ( IDebugClient4 *client, const TypeInfoPtr& typeInfo, ULONG64 offset ); + virtual ULONG64 getValue() const { return m_offset; } @@ -81,13 +82,9 @@ public: BasicTypedVar ( IDebugClient4 *client, const TypeInfoPtr& typeInfo, ULONG64 offset ) : TypedVar(client, typeInfo, offset){} - TypedVarPtr - virtual getField( const std::string &fieldName ) { - throw DbgException("no fields"); - } virtual std::string print() { - return "BasicTypedVar"; + return intBase::str(); } virtual ULONG64 getValue() const; @@ -142,4 +139,15 @@ public: /////////////////////////////////////////////////////////////////////////////////// +class UdtTypedVar : public TypedVar { + +public: + + UdtTypedVar( IDebugClient4 *client, const TypeInfoPtr& typeInfo, ULONG64 offset ) : TypedVar(client, typeInfo, offset){} + + virtual TypedVarPtr getField( const std::string &fieldName ); +}; + +/////////////////////////////////////////////////////////////////////////////////// + } // namespace pykd diff --git a/pykd/typeinfo.h b/pykd/typeinfo.h index 4350f19..8a50055 100644 --- a/pykd/typeinfo.h +++ b/pykd/typeinfo.h @@ -140,18 +140,24 @@ private: /////////////////////////////////////////////////////////////////////////////////// -class UdtTypeInfo : public BaseTypeInfo +class UdtTypeInfo : public TypeInfo { public: UdtTypeInfo ( pyDia::SymbolPtr &symbol ) : - BaseTypeInfo( symbol ) - {} + m_dia( symbol ) + {} + +protected: virtual std::string getName() { return m_dia->getName(); } + virtual ULONG getSize() { + return (ULONG)m_dia->getSize(); + } + virtual TypeInfoPtr getField( const std::string &fieldName ) { pyDia::SymbolPtr field = m_dia->getChildByName( fieldName ); TypeInfoPtr ti = TypeInfo::getTypeInfo( m_dia, fieldName ); @@ -162,6 +168,8 @@ public: virtual bool isUserDefined() { return true; } + + pyDia::SymbolPtr m_dia; }; /////////////////////////////////////////////////////////////////////////////////// diff --git a/test/scripts/pykdtest.py b/test/scripts/pykdtest.py index 012bb46..fd7a67c 100644 --- a/test/scripts/pykdtest.py +++ b/test/scripts/pykdtest.py @@ -51,8 +51,8 @@ if __name__ == "__main__": target.module = pykd.loadModule( target.moduleName ) target.module.reload(); - suite = getTestSuite() - #suite = getTestSuite( "typedvar.TypedVarTest" ) + #suite = getTestSuite() + suite = getTestSuite( "typedvar.TypedVarTest.testGlobalVar" ) unittest.TextTestRunner(stream=sys.stdout, verbosity=2).run( suite ) diff --git a/test/scripts/typedvar.py b/test/scripts/typedvar.py index 6343c52..2c91bc3 100644 --- a/test/scripts/typedvar.py +++ b/test/scripts/typedvar.py @@ -54,4 +54,12 @@ class TypedVarTest( unittest.TestCase ): self.assertEqual( 2, tv.m_arrayField[1] ) self.assertEqual( 3, tv.m_noArrayField ) self.assertNotEqual( -1, tv.m_arrayField[0] ) - self.assertNotEqual( 0, tv.m_noArrayField ) + self.assertNotEqual( 0, tv.m_noArrayField ) + + def testGlobalVar(self): + self.assertEqual( 4, target.module.typedVar( "g_ulongValue" ) ) + self.assertEqual( -100000, target.module.typedVar( "longArray" )[3] ) + self.assertEqual( 0x80000000, target.module.typedVar( "ulongArray" )[3] ) + self.assertEqual( 0x8000000000000000, target.module.typedVar( "ulonglongArray" )[3] ) + self.assertEqual( target.module.g_structTest, target.module.typedVar( "g_structTestPtr" ) ) + \ No newline at end of file diff --git a/test/targetapp/targetapp.cpp b/test/targetapp/targetapp.cpp index ccf5408..3373af9 100644 --- a/test/targetapp/targetapp.cpp +++ b/test/targetapp/targetapp.cpp @@ -62,6 +62,7 @@ wchar_t helloWStr[] = L"Hello"; unsigned char ucharArray[] = {0, 10, 0x78, 128, 0xFF }; unsigned short ushortArray[] = {0, 10, 0xFF, 0x8000, 0xFFFF }; unsigned long ulongArray[] = {0, 0xFF, 0x8000, 0x80000000, 0xFFFFFFFF }; +long longArray[] = {0, -10, -2000, -100000, 0xFFFFFFFF }; unsigned __int64 ulonglongArray[] = {0, 0xFF, 0xFFFFFFFF, 0x8000000000000000, 0xFFFFFFFFFFFFFFFF }; int intMatrix[2][3] = { { 0, 1, 2}, { 3, 4, 5 } };