From 8c7ef0441dca8b926c71670a1be7931e379602eb Mon Sep 17 00:00:00 2001 From: "SND\\kernelnet_cp" Date: Wed, 8 Aug 2012 07:00:43 +0000 Subject: [PATCH] [0.2.x] refactored : module class git-svn-id: https://pykd.svn.codeplex.com/svn@78609 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/dbgengine.h | 2 +- pykd/dia/diawrapper.cpp | 30 +++++++++++++++++----- pykd/dia/diawrapper.h | 24 ++++++++++++++++++ pykd/module.cpp | 55 ++++++++++++++--------------------------- pykd/module.h | 4 ++- pykd/symengine.h | 17 ++++++++++++- pykd/typeinfo.cpp | 2 -- 7 files changed, 86 insertions(+), 48 deletions(-) diff --git a/pykd/dbgengine.h b/pykd/dbgengine.h index 5836e42..aa2b7f2 100644 --- a/pykd/dbgengine.h +++ b/pykd/dbgengine.h @@ -33,7 +33,7 @@ BaseTypeVariant getRegVariantValue( ULONG index ); ULONG64 getRegInstructionPointer(); // это нужно сделать по-другому! -std::string getSymbolByOffset( ULONG64 offset ); +//std::string getSymbolByOffset( ULONG64 offset ); }; diff --git a/pykd/dia/diawrapper.cpp b/pykd/dia/diawrapper.cpp index 6c11f5c..2a6b719 100644 --- a/pykd/dia/diawrapper.cpp +++ b/pykd/dia/diawrapper.cpp @@ -45,7 +45,7 @@ std::string DiaException::makeFullDesc(const std::string &desc, HRESULT hres) //////////////////////////////////////////////////////////////////////////////// -SymbolPtr loadSymbolFile(const std::string &filePath, ULONGLONG loadBase ) +SymbolSessionPtr loadSymbolFile(const std::string &filePath, ULONGLONG loadBase ) { HRESULT hres; DiaDataSourcePtr dataSource; @@ -73,7 +73,7 @@ SymbolPtr loadSymbolFile(const std::string &filePath, ULONGLONG loadBase ) if ( S_OK != hres ) throw DiaException("Call IDiaSymbol::get_globalScope", hres); - return SymbolPtr( new DiaSymbol( _globalScope ) ); + return SymbolSessionPtr( new DiaSession( _session, _globalScope ) ); } ////////////////////////////////////////////////////////////////////////////////// @@ -422,11 +422,29 @@ bool DiaSymbol::isVirtualBaseClass() ////////////////////////////////////////////////////////////////////////////// -//bool DiaSymbol::isIndirectVirtualBaseClass() -//{ -// return !!callSymbol(get_indirectVirtualBaseClass); -//} +SymbolPtr DiaSession::findByRva( ULONG rva, ULONG symTag, LONG* pdisplacement ) +{ + DiaSymbolPtr child; + LONG displacement; + HRESULT hres = + m_session->findSymbolByRVAEx( + rva, + static_cast(symTag), + &child, + &displacement); + + if (S_OK != hres) + throw DiaException("Call IDiaSession::findSymbolByRVAEx", hres); + if (!child) + throw DiaException("Call IDiaSession::findSymbolByRVAEx", E_UNEXPECTED); + if ( pdisplacement == NULL && displacement != 0 ) + throw DiaException("Call IDiaSession::findSymbolByRVAEx failed to find suymbol" ); + + return SymbolPtr( new DiaSymbol(child) ); +} + +////////////////////////////////////////////////////////////////////////////// }; // pykd nemaspace end diff --git a/pykd/dia/diawrapper.h b/pykd/dia/diawrapper.h index 98318c3..2ab2697 100644 --- a/pykd/dia/diawrapper.h +++ b/pykd/dia/diawrapper.h @@ -232,6 +232,30 @@ protected: //////////////////////////////////////////////////////////////////////////// +class DiaSession : public SymbolSession +{ +public: + + DiaSession( IDiaSession* session, IDiaSymbol *globalScope ) : + m_globalScope( new DiaSymbol( globalScope ) ), + m_session( session ) + {} + + SymbolPtr& getSymbolScope() { + return m_globalScope; + } + + SymbolPtr findByRva( ULONG rva, ULONG symTag = SymTagData, LONG* displacement = NULL ); + +private: + + SymbolPtr m_globalScope; + DiaSessionPtr m_session; + +}; + +//////////////////////////////////////////////////////////////////////////// + } // end pykd namespace diff --git a/pykd/module.cpp b/pykd/module.cpp index aa81f15..1981e97 100644 --- a/pykd/module.cpp +++ b/pykd/module.cpp @@ -42,24 +42,31 @@ Module::Module(ULONG64 offset ) ///////////////////////////////////////////////////////////////////////////////////// -SymbolPtr& Module::getSymScope() +SymbolSessionPtr& Module::getSymSession() { do { - if ( m_symScope ) - break; + if ( m_symSession ) + return m_symSession; if ( m_symfile.empty() ) break; - m_symScope = loadSymbolFile( m_symfile, m_base ); + m_symSession = loadSymbolFile( m_symfile, m_base ); } while( false ); - if ( !m_symScope ) + if ( !m_symSession ) throw SymbolException( "failed to find symbol file" ); - return m_symScope; + return m_symSession; +} + +///////////////////////////////////////////////////////////////////////////////////// + +SymbolPtr& Module::getSymScope() +{ + return getSymSession()->getSymbolScope(); } ///////////////////////////////////////////////////////////////////////////////////// @@ -67,7 +74,7 @@ SymbolPtr& Module::getSymScope() void Module::reloadSymbols() { m_symfile = getModuleSymbolFileName( m_base ); - m_symScope.reset(); + m_symSession.reset(); } ///////////////////////////////////////////////////////////////////////////////////// @@ -126,9 +133,11 @@ Module::getTypedVarByAddr( ULONG64 offset ) if ( offset < m_base || offset > getEnd() ) throw DbgException( "address is out of the module space" ); - std::string symName = getSymbolByOffset( offset ); + SymbolPtr symVar = getSymSession()->findByRva( (ULONG)(offset - m_base ) ); - return getTypedVarByName( symName ); + TypeInfoPtr typeInfo = TypeInfo::getTypeInfo( symVar->getType() ); + + return TypedVar::getTypedVar(typeInfo, VarDataMemory::factory(offset) ); } /////////////////////////////////////////////////////////////////////////////// @@ -147,32 +156,6 @@ Module::getTypedVarByName( const std::string &symName ) } return TypedVar::getTypedVar( typeInfo, VarDataConst::factory(symVar) ); - - - - - //HRESULT hres; - - //pyDia::SymbolPtr symVar = getSymScope()->getChildByName( symName ); - - //std::string fullName = m_name; - //fullName += '!'; - //fullName += symName; - - //ULONG64 offset; - - //hres = m_symbols->GetOffsetByName( fullName.c_str(), &offset ); - - //TypeInfoPtr typeInfo = TypeInfo::getTypeInfo( symVar->getType() ); - - //if ( FAILED( hres ) ) - //{ - // if ( LocIsConstant == symVar->getLocType() ) - // return TypedVar::getTypedVar( m_client, typeInfo, VarDataConst::factory(m_control, symVar) ); - // throw DbgException("IDebugSymbols::GetOffsetByName failed" ); - //} - - //return TypedVar::getTypedVar( m_client, typeInfo, VarDataMemory::factory(m_dataSpaces, offset) ); } /////////////////////////////////////////////////////////////////////////////// @@ -211,5 +194,3 @@ python::list Module::getTypedVarListByTypeName( ULONG64 listHeadAddress, const s /////////////////////////////////////////////////////////////////////////////////// }; // end of namespace pykd - - diff --git a/pykd/module.h b/pykd/module.h index f5a657b..2b603b9 100644 --- a/pykd/module.h +++ b/pykd/module.h @@ -99,6 +99,8 @@ private: SymbolPtr& getSymScope(); + SymbolSessionPtr& getSymSession(); + BaseTypeVariant getValue() { return BaseTypeVariant(m_base); } @@ -113,7 +115,7 @@ private: ULONG m_timeDataStamp; ULONG m_checkSum; - SymbolPtr m_symScope; + SymbolSessionPtr m_symSession; }; /////////////////////////////////////////////////////////////////////////////////// diff --git a/pykd/symengine.h b/pykd/symengine.h index 749de4e..659a76a 100644 --- a/pykd/symengine.h +++ b/pykd/symengine.h @@ -10,6 +10,9 @@ class Symbol; typedef boost::shared_ptr< Symbol > SymbolPtr; typedef std::list< SymbolPtr > SymbolPtrList; +class SymbolSession; +typedef boost::shared_ptr SymbolSessionPtr; + //////////////////////////////////////////////////////////////////////////////// enum SymTagEnum @@ -139,9 +142,21 @@ public: /////////////////////////////////////////////////////////////////////////////// +class SymbolSession { + +public: + + virtual SymbolPtr& getSymbolScope() = 0; + + virtual SymbolPtr findByRva( ULONG rva, ULONG symTag = SymTagData, LONG* displacement = NULL ) = 0; + +}; + +/////////////////////////////////////////////////////////////////////////////// + std::string getBasicTypeName( ULONG basicType ); -SymbolPtr loadSymbolFile(const std::string &filePath, ULONGLONG loadBase = 0); +SymbolSessionPtr loadSymbolFile(const std::string &filePath, ULONGLONG loadBase = 0); //////////////////////////////////////////////////////////////////////////////// diff --git a/pykd/typeinfo.cpp b/pykd/typeinfo.cpp index 4bb341e..977ac41 100644 --- a/pykd/typeinfo.cpp +++ b/pykd/typeinfo.cpp @@ -16,8 +16,6 @@ void splitSymName( const std::string &fullName, std::string &moduleName, std::st { boost::cmatch matchResult; - //OutputReader outputDiscard( m_client ); - if ( !boost::regex_match( fullName.c_str(), matchResult, moduleSymMatch ) ) { std::stringstream sstr;