[0.2.x] refactored : module class

git-svn-id: https://pykd.svn.codeplex.com/svn@78609 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
SND\kernelnet_cp 2012-08-08 07:00:43 +00:00 committed by Mikhail I. Izmestev
parent 91e158ea6a
commit 8c7ef0441d
7 changed files with 86 additions and 48 deletions

View File

@ -33,7 +33,7 @@ BaseTypeVariant getRegVariantValue( ULONG index );
ULONG64 getRegInstructionPointer();
// это нужно сделать по-другому!
std::string getSymbolByOffset( ULONG64 offset );
//std::string getSymbolByOffset( ULONG64 offset );
};

View File

@ -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<enum ::SymTagEnum>(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

View File

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

View File

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

View File

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

View File

@ -10,6 +10,9 @@ class Symbol;
typedef boost::shared_ptr< Symbol > SymbolPtr;
typedef std::list< SymbolPtr > SymbolPtrList;
class SymbolSession;
typedef boost::shared_ptr<SymbolSession> 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);
////////////////////////////////////////////////////////////////////////////////

View File

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