diff --git a/pykd/dbgext.cpp b/pykd/dbgext.cpp index e00dae1..c53a9dd 100644 --- a/pykd/dbgext.cpp +++ b/pykd/dbgext.cpp @@ -102,11 +102,12 @@ BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( DebugClient_loadSignDWords, DebugClient: BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( DebugClient_loadSignQWords, DebugClient::loadSignQWords, 2, 3 ); BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( DebugClient_compareMemory, DebugClient::compareMemory, 3, 4 ); BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( DebugClient_getLocals, DebugClient::getLocals, 0, 1 ); -BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( pyDia_Symbol_findChildrenEx, pyDia::Symbol::findChildrenEx, 1, 3 ); BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( DebugClient_setSoftwareBp, DebugClient::setSoftwareBp, 1, 2 ); BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( DebugClient_setHardwareBp, DebugClient::setHardwareBp, 3, 4 ); BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( StackFrame_getLocals, StackFrame::getLocals, 0, 1 ); +BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( pyDia_Symbol_findChildrenEx, pyDia::Symbol::findChildrenEx, 1, 3 ); + #define DEF_PY_CONST_ULONG(x) \ python::scope().attr(#x) = ULONG(##x) @@ -723,8 +724,8 @@ BOOST_PYTHON_MODULE( pykd ) "Retrieves the type of the target CPU: IMAGE_FILE_MACHINE_XXX") .def( "__str__", &pyDia::Symbol::print) .def("__getitem__", &pyDia::Symbol::getChildByName) - .def("__len__", &pyDia::Symbol::getChildCount ) - .def("__getitem__", &pyDia::Symbol::getChildByIndex) + .def("__len__", (ULONG (pyDia::Symbol::*)())&pyDia::Symbol::getChildCount ) + .def("__getitem__", (pyDia::SymbolPtr(pyDia::Symbol::*)(ULONG) )&pyDia::Symbol::getChildByIndex) .def("__eq__", &pyDia::Symbol::eq) .def("__hash__", &pyDia::Symbol::getIndexId); diff --git a/pykd/diawrapper.cpp b/pykd/diawrapper.cpp index c04bd26..1f64dd4 100644 --- a/pykd/diawrapper.cpp +++ b/pykd/diawrapper.cpp @@ -316,12 +316,12 @@ SymbolPtr Symbol::getChildByName(const std::string &_name) //////////////////////////////////////////////////////////////////////////////// -ULONG Symbol::getChildCount() +ULONG Symbol::getChildCount( ULONG symTag ) { DiaEnumSymbolsPtr symbols; HRESULT hres = m_symbol->findChildren( - SymTagNull, + static_cast(symTag), NULL, nsCaseSensitive, &symbols); @@ -338,12 +338,12 @@ ULONG Symbol::getChildCount() //////////////////////////////////////////////////////////////////////////////// -SymbolPtr Symbol::getChildByIndex(ULONG _index) +SymbolPtr Symbol::getChildByIndex(ULONG _index, ULONG symTag ) { DiaEnumSymbolsPtr symbols; HRESULT hres = m_symbol->findChildren( - SymTagNull, + static_cast(symTag), NULL, nsCaseSensitive, &symbols); diff --git a/pykd/diawrapper.h b/pykd/diawrapper.h index 09345d5..9dbcf47 100644 --- a/pykd/diawrapper.h +++ b/pykd/diawrapper.h @@ -133,8 +133,10 @@ public: } SymbolPtr getChildByName(const std::string &_name); - ULONG getChildCount(); - SymbolPtr getChildByIndex(ULONG _index); + + ULONG getChildCount( ULONG symTag = SymTagNull ); + + SymbolPtr getChildByIndex(ULONG _index, ULONG symTag = SymTagNull ); bool isConstant(); diff --git a/pykd/typeinfo.cpp b/pykd/typeinfo.cpp index 5e06880..c1cc4b1 100644 --- a/pykd/typeinfo.cpp +++ b/pykd/typeinfo.cpp @@ -15,6 +15,7 @@ TypeInfoPtr TypeInfo::getTypeInfo( pyDia::SymbolPtr &typeSym ) return getBaseTypeInfo( typeSym ); case SymTagUDT: + case SymTagBaseClass: return TypeInfoPtr( new UdtTypeInfo( typeSym ) ); case SymTagArrayType: @@ -479,10 +480,10 @@ TypeInfoPtr UdtTypeInfo::getFieldByIndex( ULONG index ) std::string UdtTypeInfo::getFieldNameByIndex( ULONG index ) { - if ( index >= m_dia->getChildCount() ) + if ( index >= m_dia->getChildCount( SymTagData ) ) throw TypeException( m_dia->getName(), ": field not found" ); - pyDia::SymbolPtr field = m_dia->getChildByIndex(index); + pyDia::SymbolPtr field = m_dia->getChildByIndex(index, SymTagData); if ( !field ) throw TypeException( m_dia->getName(), ": field not found" ); @@ -494,7 +495,7 @@ std::string UdtTypeInfo::getFieldNameByIndex( ULONG index ) ULONG UdtTypeInfo::getFieldCount() { - return m_dia->getChildCount(); + return m_dia->getChildCount( SymTagData ); } ///////////////////////////////////////////////////////////////////////////////////// diff --git a/test/scripts/typedvar.py b/test/scripts/typedvar.py index c238ed6..b93a214 100644 --- a/test/scripts/typedvar.py +++ b/test/scripts/typedvar.py @@ -189,3 +189,25 @@ class TypedVarTest( unittest.TestCase ): tv2 = target.module.typedVar( "structTest", tv1 ) self.assertEqual( tv1, tv2 ) self.assertTrue( tv1 ) + + + def testPrint(self): + self.assertTrue( str(target.module.typedVar( "g_ucharValue" ) ) ) + self.assertTrue( str(target.module.typedVar( "g_ushortValue" ) ) ) + self.assertTrue( str(target.module.typedVar( "g_ulongValue" ) ) ) + self.assertTrue( str(target.module.typedVar( "g_ulonglongValue" ) ) ) + self.assertTrue( str(target.module.typedVar( "g_structWithBits" ) ) ) + self.assertTrue( str(target.module.typedVar( "g_structTest" ) ) ) + self.assertTrue( str(target.module.typedVar( "g_structTest1" ) ) ) + self.assertTrue( str(target.module.typedVar( "g_testArray" ) ) ) + self.assertTrue( str(target.module.typedVar( "g_structTestPtr" ) ) ) + self.assertTrue( str(target.module.typedVar( "g_structTestPtrPtr" ) ) ) + self.assertTrue( str(target.module.typedVar( "longlongArray" ) ) ) + self.assertTrue( str(target.module.typedVar( "intMatrix4" ) ) ) + self.assertTrue( str(target.module.typedVar( "ptrIntMatrix" ) ) ) + self.assertTrue( str(target.module.typedVar( "g_classChild" ) ) ) + self.assertTrue( str(target.module.typedVar( "g_struct3" ) ) ) + self.assertTrue( str(target.module.typedVar( "g_listHead" ) ) ) + self.assertTrue( str(target.module.typedVar( "g_voidPtr" ) ) ) + self.assertTrue( str(target.module.typedVar( "g_arrOfPtrToFunc" ) ) ) + self.assertTrue( str(target.module.typedVar( "g_unTypedPtrToFunction" ) ) ) diff --git a/test/targetapp/targetapp.cpp b/test/targetapp/targetapp.cpp index 371f541..35cd8ad 100644 --- a/test/targetapp/targetapp.cpp +++ b/test/targetapp/targetapp.cpp @@ -237,7 +237,7 @@ StructWithNested g_structWithNested; StructWithNested::Nested g_structNested; WNDENUMPROC g_ptrToFunction; -void *g_unTypedPtrToFunction; +void *g_unTypedPtrToFunction = g_ptrToFunction; #pragma pack( pop ) ////////////////////////////////////////////////////////////////////////////////