mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-21 12:53:23 +08:00
[0.1.x] updated : typedVar
git-svn-id: https://pykd.svn.codeplex.com/svn@71478 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
parent
859cfaae3e
commit
e3900c02a5
@ -372,10 +372,10 @@ BOOST_PYTHON_MODULE( pykd )
|
||||
.def( "field", &pykd::TypeInfo::getField )
|
||||
.def( "__getattr__", &pykd::TypeInfo::getField );
|
||||
|
||||
python::class_<TypedVar, TypedVarPtr, python::bases<intBase> >("typedVar",
|
||||
python::class_<TypedVar, TypedVarPtr, python::bases<intBase>, 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<const TypeInfoPtr&, ULONG64>() )
|
||||
//.def( python::init<const TypeInfoPtr&, ULONG64>() )
|
||||
.def("getAddress", &TypedVar::getAddress,
|
||||
"Return virtual address" )
|
||||
.def("sizeof", &TypedVar::getSize,
|
||||
|
@ -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 );
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -63,13 +63,13 @@ public:
|
||||
return TypeInfo::getTypeInfo( boost::static_pointer_cast<pyDia::Symbol>( 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:
|
||||
|
||||
|
@ -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
|
@ -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
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -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 )
|
||||
|
||||
|
@ -55,3 +55,11 @@ class TypedVarTest( unittest.TestCase ):
|
||||
self.assertEqual( 3, tv.m_noArrayField )
|
||||
self.assertNotEqual( -1, tv.m_arrayField[0] )
|
||||
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" ) )
|
||||
|
@ -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 } };
|
||||
|
Loading…
Reference in New Issue
Block a user