diff --git a/pykd/dbgclient.cpp b/pykd/dbgclient.cpp index cca9a98..29a2918 100644 --- a/pykd/dbgclient.cpp +++ b/pykd/dbgclient.cpp @@ -504,9 +504,9 @@ TypeInfoPtr DebugClient::getTypeInfoByName( const std::string &typeName ) splitSymName( typeName, moduleName, symName ); - Module module = loadModuleByName( moduleName ); + ModulePtr module = loadModuleByName( moduleName ); - return module.getTypeByName( symName ); + return module->getTypeByName( symName ); } /////////////////////////////////////////////////////////////////////////////////// @@ -518,9 +518,9 @@ TypedVarPtr DebugClient::getTypedVarByName( const std::string &varName ) splitSymName( varName, moduleName, symName ); - Module module = loadModuleByName( moduleName ); + ModulePtr module = loadModuleByName( moduleName ); - return module.getTypedVarByName( symName ); + return module->getTypedVarByName( symName ); } /////////////////////////////////////////////////////////////////////////////////// @@ -534,9 +534,9 @@ TypedVarPtr DebugClient::getTypedVarByTypeName( const std::string &typeName, ULO splitSymName( typeName, moduleName, symName ); - Module module = loadModuleByName( moduleName ); + ModulePtr module = loadModuleByName( moduleName ); - return module.getTypedVarByTypeName( symName, addr ); + return module->getTypedVarByTypeName( symName, addr ); } /////////////////////////////////////////////////////////////////////////////////// @@ -550,9 +550,9 @@ TypedVarPtr DebugClient::containingRecordByName( ULONG64 addr, const std::string splitSymName( typeName, moduleName, symName ); - Module module = loadModuleByName( moduleName ); + ModulePtr module = loadModuleByName( moduleName ); - return module.containingRecordByName( addr, symName, fieldName ); + return module->containingRecordByName( addr, symName, fieldName ); } TypedVarPtr containingRecordByName( ULONG64 addr, const std::string &typeName, const std::string &fieldName ) @@ -618,9 +618,9 @@ python::list DebugClient::getTypedVarListByTypeName( ULONG64 listHeadAddress, co splitSymName( typeName, moduleName, symName ); - Module module = loadModuleByName( moduleName ); + ModulePtr module = loadModuleByName( moduleName ); - return module.getTypedVarListByTypeName( listHeadAddress, symName, listEntryName ); + return module->getTypedVarListByTypeName( listHeadAddress, symName, listEntryName ); } python::list getTypedVarListByTypeName( ULONG64 listHeadAddress, const std::string &typeName, const std::string &listEntryName ) @@ -656,9 +656,9 @@ python::list DebugClient::getTypedVarArrayByTypeName( ULONG64 addr, const std::s splitSymName( typeName, moduleName, symName ); - Module module = loadModuleByName( moduleName ); + ModulePtr module = loadModuleByName( moduleName ); - return module.getTypedVarArrayByTypeName( addr, symName, number ); + return module->getTypedVarArrayByTypeName( addr, symName, number ); } python::list getTypedVarArrayByTypeName( ULONG64 addr, const std::string &typeName, ULONG number ) diff --git a/pykd/dbgclient.h b/pykd/dbgclient.h index ab1316c..24db2c3 100644 --- a/pykd/dbgclient.h +++ b/pykd/dbgclient.h @@ -153,12 +153,12 @@ public: void loadDump( const std::wstring &fileName ); - Module loadModuleByName( const std::string &moduleName ) { - return Module( m_client, m_symSymbols, moduleName ); + ModulePtr loadModuleByName( const std::string &moduleName ) { + return ModulePtr( new Module( m_client, m_symSymbols, moduleName ) ); } - Module loadModuleByOffset( ULONG64 offset ) { - return Module( m_client, m_symSymbols, offset ); + ModulePtr loadModuleByOffset( ULONG64 offset ) { + return ModulePtr( new Module( m_client, m_symSymbols, offset ) ); } DbgExtensionPtr loadExtension( const std::wstring &extPath ) { diff --git a/pykd/dbgevent.h b/pykd/dbgevent.h index 893c7a6..0ca7cff 100644 --- a/pykd/dbgevent.h +++ b/pykd/dbgevent.h @@ -72,7 +72,7 @@ protected: virtual ULONG onException(const python::dict &/*exceptData*/) = 0; - virtual ULONG onLoadModule(const Module &/* module */) = 0; + virtual ULONG onLoadModule(const ModulePtr &/* module */) = 0; virtual ULONG onUnloadModule(ULONG64 /*modBase*/) = 0; @@ -108,8 +108,8 @@ public: return handler("onException", exceptData); } - ULONG onLoadModule(const Module &module) { - return handler("onLoadModule", module ); + ULONG onLoadModule(const ModulePtr &module) { + return handler("onLoadModule", module ); } ULONG onUnloadModule(ULONG64 modBase) { diff --git a/pykd/livevar.cpp b/pykd/livevar.cpp index 435320f..bc57438 100644 --- a/pykd/livevar.cpp +++ b/pykd/livevar.cpp @@ -17,7 +17,7 @@ namespace impl { struct addLocals { python::dict &m_locals; - const Module &m_module; + const ModulePtr m_module; ULONG m_rva; ContextPtr m_ctx; IDebugClient4 *m_client; @@ -95,7 +95,7 @@ void addLocals::appendVar(pyDia::SymbolPtr symData) typedVar = getTypeVarByOffset( symData, - m_module.getBase() + symData->getRva() ); + m_module->getBase() + symData->getRva() ); break; case LocIsRegRel: @@ -189,10 +189,10 @@ python::dict DebugClient::getLocals(ContextPtr ctx OPTIONAL) const ULONG64 instrPtr = ctx->getIp(); - Module mod = loadModuleByOffset( instrPtr ); - const ULONG rva = static_cast( instrPtr - mod.getBase() ); + ModulePtr mod = loadModuleByOffset( instrPtr ); + const ULONG rva = static_cast( instrPtr - mod->getBase() ); - pyDia::GlobalScopePtr globScope = mod.getDia(); + pyDia::GlobalScopePtr globScope = mod->getDia(); LONG funcDispl; pyDia::SymbolPtr symFunc = globScope->findByRvaImpl(rva, SymTagFunction, funcDispl); diff --git a/pykd/module.cpp b/pykd/module.cpp index 49de94b..5d9828d 100644 --- a/pykd/module.cpp +++ b/pykd/module.cpp @@ -8,13 +8,11 @@ namespace pykd { /////////////////////////////////////////////////////////////////////////////////// -Module loadModuleByName( const std::string &moduleName ) { +ModulePtr Module::loadModuleByName( const std::string &moduleName ) { return g_dbgClient->loadModuleByName( moduleName ); }; -/////////////////////////////////////////////////////////////////////////////////// - -Module loadModuleByOffset( ULONG64 offset ) { +ModulePtr Module::loadModuleByOffset( ULONG64 offset ) { return g_dbgClient->loadModuleByOffset( offset ); } diff --git a/pykd/module.h b/pykd/module.h index 3f33090..159d36d 100644 --- a/pykd/module.h +++ b/pykd/module.h @@ -12,8 +12,21 @@ namespace pykd { /////////////////////////////////////////////////////////////////////////////////// +class Module; +typedef boost::shared_ptr ModulePtr; + +/////////////////////////////////////////////////////////////////////////////////// + class Module : public intBase, private DbgObject { +public: + + static + ModulePtr loadModuleByName( const std::string &name ); + + static + ModulePtr loadModuleByOffset( ULONG64 offset ); + public: Module( IDebugClient4 *client, SynSymbolsPtr synSymbols, const std::string& moduleName ); @@ -121,12 +134,6 @@ private: /////////////////////////////////////////////////////////////////////////////////// -Module loadModuleByName( const std::string &moduleName ) ; - -Module loadModuleByOffset( ULONG64 offset ); - -/////////////////////////////////////////////////////////////////////////////////// - }; // end pykd namespace diff --git a/pykd/pymod.cpp b/pykd/pymod.cpp index 63666ec..92813ac 100644 --- a/pykd/pymod.cpp +++ b/pykd/pymod.cpp @@ -452,9 +452,9 @@ BOOST_PYTHON_MODULE( pykd ) "Delete synthetic symbols by mask of module and symbol name"); python::def( "loadExt", &pykd::loadExtension, "Load a debuger extension" ); - python::def( "loadModule", &loadModuleByName, + python::def( "loadModule", &Module::loadModuleByName, "Return instance of Module class" ); - python::def( "loadModule", &loadModuleByOffset, + python::def( "loadModule", &Module::loadModuleByOffset, "Return instance of the Module class which posseses specified address" ); python::def( "dbgCommand", &pykd::dbgCommand, "Run a debugger's command and return it's result as a string" ), @@ -558,7 +558,9 @@ BOOST_PYTHON_MODULE( pykd ) .def("__getitem__", &TypedVar::getElementByIndex ) .def("__getitem__", &TypedVar::getElementByIndexPtr ); - python::class_ >("module", "Class representing executable module", python::no_init ) + python::class_ >("module", "Class representing executable module", python::no_init ) + .def("__init__", python::make_constructor(Module::loadModuleByName) ) + .def("__init__", python::make_constructor(Module::loadModuleByOffset) ) .def("begin", &Module::getBase, "Return start address of the module" ) .def("end", &Module::getEnd, diff --git a/test/scripts/moduletest.py b/test/scripts/moduletest.py index 2fe3541..6638dbe 100644 --- a/test/scripts/moduletest.py +++ b/test/scripts/moduletest.py @@ -9,9 +9,8 @@ import pykd class ModuleTest( unittest.TestCase ): def testCtor( self ): - " module class can not be created direct """ - try: pykd.module() - except RuntimeError: pass + self.assertEqual( target.module.name(), pykd.module(target.module.begin() ).name() ) + self.assertEqual( target.module.name(), pykd.module(target.module.name() ).name() ) def testName( self ): self.assertEqual( target.moduleName, target.module.name() )