[0.1.x] added : module class can be created directly ( added two constructors )

git-svn-id: https://pykd.svn.codeplex.com/svn@75295 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
SND\kernelnet_cp 2012-04-05 16:15:10 +00:00 committed by Mikhail I. Izmestev
parent 322f1a39a6
commit 811a673b47
8 changed files with 46 additions and 40 deletions

View File

@ -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 )

View File

@ -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 ) {

View File

@ -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<const python::dict&>("onException", exceptData);
}
ULONG onLoadModule(const Module &module) {
return handler<const Module&>("onLoadModule", module );
ULONG onLoadModule(const ModulePtr &module) {
return handler<const ModulePtr&>("onLoadModule", module );
}
ULONG onUnloadModule(ULONG64 modBase) {

View File

@ -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<ULONG>( instrPtr - mod.getBase() );
ModulePtr mod = loadModuleByOffset( instrPtr );
const ULONG rva = static_cast<ULONG>( instrPtr - mod->getBase() );
pyDia::GlobalScopePtr globScope = mod.getDia();
pyDia::GlobalScopePtr globScope = mod->getDia();
LONG funcDispl;
pyDia::SymbolPtr symFunc =
globScope->findByRvaImpl(rva, SymTagFunction, funcDispl);

View File

@ -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 );
}

View File

@ -12,8 +12,21 @@ namespace pykd {
///////////////////////////////////////////////////////////////////////////////////
class Module;
typedef boost::shared_ptr<Module> 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

View File

@ -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, python::bases<intBase> >("module", "Class representing executable module", python::no_init )
python::class_<Module, ModulePtr, python::bases<intBase> >("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,

View File

@ -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() )