mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-19 11:03:23 +08:00
added typeInfo::scopeName method
added typeInfoProviderIterator class added typeInfoProvider::getIterator method added typeInfoProvider::__iter__ method added typeInfoProvider::__getattr__ method
This commit is contained in:
parent
7fa4ec351a
commit
223c225d71
2
kdlibcpp
2
kdlibcpp
@ -1 +1 @@
|
||||
Subproject commit 8d28d97eaa231f1c7c8147e9a54d71344deeea21
|
||||
Subproject commit b4c87cee2d2b6e373c4cc35bde49c60a777d0ecb
|
@ -2,7 +2,7 @@
|
||||
#define PYKD_VERSION_MAJOR 0
|
||||
#define PYKD_VERSION_MINOR 3
|
||||
#define PYKD_VERSION_SUBVERSION 3
|
||||
#define PYKD_VERSION_BUILDNO 3
|
||||
#define PYKD_VERSION_BUILDNO 4
|
||||
|
||||
#define __VER_STR2__(x) #x
|
||||
#define __VER_STR1__(x) __VER_STR2__(x)
|
||||
|
@ -878,6 +878,8 @@ BOOST_PYTHON_MODULE( pykd )
|
||||
.def("__init__", python::make_constructor( pykd::getTypeInfoByName ) )
|
||||
.def( "name", TypeInfoAdapter::getName,
|
||||
"Return type name" )
|
||||
.def("scopeName", TypeInfoAdapter::getScopeName,
|
||||
"Return name of type scope ( module name )" )
|
||||
.def( "size", TypeInfoAdapter::getSize,
|
||||
"Return type size" )
|
||||
.def( "staticOffset", TypeInfoAdapter::getStaticOffset,
|
||||
@ -1229,10 +1231,25 @@ BOOST_PYTHON_MODULE( pykd )
|
||||
"Change the current instruction" )
|
||||
.def( "__str__", DisasmAdapter::instruction );
|
||||
|
||||
|
||||
python::class_<TypeInfoProviderIterator>("typeInfoProviderIterator", "iterator for type provider", python::no_init)
|
||||
.def("__iter__", &TypeInfoProviderIterator::self)
|
||||
#if PY_VERSION_HEX < 0x03000000
|
||||
.def("next", &TypeInfoProviderIterator::next)
|
||||
#else
|
||||
.def("__next__", &TypeInfoProviderIterator::next)
|
||||
#endif
|
||||
;
|
||||
|
||||
|
||||
python::class_<kdlib::TypeInfoProvider, kdlib::TypeInfoProviderPtr, boost::noncopyable>("typeInfoProvider",
|
||||
"Get abstaract access to different type info sources", python::no_init)
|
||||
.def( "getTypeByName", TypeInfoProviderAdapter::getTypeByName,
|
||||
"Get type info by it's name" )
|
||||
.def( "typeIterator", TypeInfoProviderAdapter::getTypeIterWithMask, python::return_value_policy<python::manage_new_object>(),
|
||||
"Return type iterator with specified mask")
|
||||
.def("__iter__", TypeInfoProviderAdapter::getTypeIter, python::return_value_policy<python::manage_new_object>())
|
||||
.def( "__getattr__", TypeInfoProviderAdapter::getTypeAsAttr )
|
||||
;
|
||||
|
||||
python::enum_<kdlib::DebugCallbackResult>("eventResult", "Return value of event handler")
|
||||
@ -1378,7 +1395,7 @@ BOOST_PYTHON_MODULE( pykd )
|
||||
.value("FinalBreak", kdlib::FinalBreak)
|
||||
.value("PreferDml", kdlib::PreferDml)
|
||||
;
|
||||
|
||||
|
||||
python::enum_<kdlib::BreakpointAccess>("breakpointAccess", "Breakpoint access types")
|
||||
.value("Read", kdlib::Read)
|
||||
.value("Write", kdlib::Write)
|
||||
|
@ -356,5 +356,21 @@ python::object callFunctionRaw( python::tuple& args, python::dict& kwargs)
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
kdlib::TypeInfoPtr TypeInfoProviderAdapter::getTypeAsAttr(kdlib::TypeInfoProvider &typeInfoProvider, const std::wstring& name)
|
||||
{
|
||||
|
||||
try {
|
||||
AutoRestorePyState pystate;
|
||||
return typeInfoProvider.getTypeByName(name);
|
||||
}
|
||||
catch (kdlib::TypeException&)
|
||||
{}
|
||||
|
||||
std::wstringstream sstr;
|
||||
sstr << L'\'' << name << L'\'' << L" not found";
|
||||
throw AttributeException(std::string(_bstr_t(sstr.str().c_str())).c_str());
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
} // pykd namespace
|
||||
|
@ -83,6 +83,12 @@ struct TypeInfoAdapter : public kdlib::TypeInfo {
|
||||
return typeInfo.getName();
|
||||
}
|
||||
|
||||
static std::wstring getScopeName( kdlib::TypeInfo &typeInfo )
|
||||
{
|
||||
AutoRestorePyState pystate;
|
||||
return typeInfo.getScopeName();
|
||||
}
|
||||
|
||||
static size_t getSize( kdlib::TypeInfo &typeInfo )
|
||||
{
|
||||
AutoRestorePyState pystate;
|
||||
@ -309,6 +315,38 @@ struct TypeInfoAdapter : public kdlib::TypeInfo {
|
||||
};
|
||||
|
||||
|
||||
class TypeInfoProviderIterator {
|
||||
|
||||
public:
|
||||
|
||||
TypeInfoProviderIterator(kdlib::TypeInfoEnumeratorPtr typeInfoEnum) :
|
||||
m_typeInfoEnum(typeInfoEnum)
|
||||
{}
|
||||
|
||||
static python::object self(const python::object& obj)
|
||||
{
|
||||
return obj;
|
||||
}
|
||||
|
||||
kdlib::TypeInfoPtr next()
|
||||
{
|
||||
AutoRestorePyState pystate;
|
||||
|
||||
kdlib::TypeInfoPtr typeInfo = m_typeInfoEnum->Next();
|
||||
|
||||
if (!typeInfo)
|
||||
throw StopIteration("No more data.");
|
||||
|
||||
return typeInfo;
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
|
||||
kdlib::TypeInfoEnumeratorPtr m_typeInfoEnum;
|
||||
|
||||
};
|
||||
|
||||
struct TypeInfoProviderAdapter : public kdlib::TypeInfoProvider
|
||||
{
|
||||
|
||||
@ -317,6 +355,19 @@ struct TypeInfoProviderAdapter : public kdlib::TypeInfoProvider
|
||||
AutoRestorePyState pystate;
|
||||
return typeInfoProvider.getTypeByName(name);
|
||||
}
|
||||
|
||||
static TypeInfoProviderIterator* getTypeIter( kdlib::TypeInfoProvider &typeInfoProvider )
|
||||
{
|
||||
return new TypeInfoProviderIterator( typeInfoProvider.getTypeEnumerator() );
|
||||
};
|
||||
|
||||
static TypeInfoProviderIterator* getTypeIterWithMask( kdlib::TypeInfoProvider &typeInfoProvider, const std::wstring& mask)
|
||||
{
|
||||
return new TypeInfoProviderIterator( typeInfoProvider.getTypeEnumerator(mask) );
|
||||
}
|
||||
|
||||
static kdlib::TypeInfoPtr getTypeAsAttr(kdlib::TypeInfoProvider &typeInfoProvider, const std::wstring& name);
|
||||
|
||||
};
|
||||
|
||||
struct BaseTypesEnum {
|
||||
@ -338,4 +389,9 @@ struct BaseTypesEnum {
|
||||
static kdlib::TypeInfoPtr getDouble() { return pykd::getTypeInfoByName(L"Double"); }
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
} // end namespace pykd
|
||||
|
@ -8,7 +8,7 @@ import sys
|
||||
|
||||
_name = "pykd"
|
||||
_desc = "python windbg extension"
|
||||
_version = '0.3.3.2'
|
||||
_version = '0.3.3.4'
|
||||
|
||||
def getReleaseSrc():
|
||||
return 'Release_%d.%d' % sys.version_info[0:2]
|
||||
|
@ -150,11 +150,13 @@ def printProcess(process,processFilter,threadFilter,moduleFilter,funcFilter,prin
|
||||
|
||||
try:
|
||||
|
||||
setCPUMode(CPUType.I386)
|
||||
dbgCommand(".thread /w %x" % thread)
|
||||
#setCPUMode(CPUType.I386)
|
||||
|
||||
if not wow64reloaded:
|
||||
dbgCommand( ".reload /user" )
|
||||
wow64reloaded = True
|
||||
#if not wow64reloaded:
|
||||
dbgCommand( ".reload /user" )
|
||||
# wow64reloaded = True
|
||||
|
||||
stkWow64 = getStack()
|
||||
|
||||
except DbgException:
|
||||
|
@ -342,3 +342,16 @@ class TypeInfoTest( unittest.TestCase ):
|
||||
classChild = target.module.type("classChild")
|
||||
self.assertEqual( ["classBase1", "classBase2"], [ classChild.baseClass(i).name() for i in range(classChild.getNumberBaseClasses()) ] )
|
||||
|
||||
def testPdbTypeProvider(self):
|
||||
pdb = target.module.symfile()
|
||||
typeProvider = pykd.getTypeInfoProviderFromPdb(pdb)
|
||||
self.assertEqual("structTest", typeProvider.getTypeByName("structTest").name())
|
||||
self.assertEqual("structTest", typeProvider.structTest.name())
|
||||
self.assertEqual(22, len(list(typeProvider.typeIterator("*struct*"))))
|
||||
|
||||
def testScopeName(self):
|
||||
self.assertEqual( target.module.name(), pykd.typeInfo( "structTest" ).scopeName() )
|
||||
self.assertEqual( target.module.name(), pykd.typeInfo( "structWithNested::Nested" ).scopeName() )
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user