[0.1.x] added : typeInfo class based at DIA

git-svn-id: https://pykd.svn.codeplex.com/svn@70175 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
SND\kernelnet_cp 2011-10-03 07:40:27 +00:00 committed by Mikhail I. Izmestev
parent 7fb30a9912
commit f86dca719a
8 changed files with 225 additions and 1229 deletions

View File

@ -8,8 +8,7 @@ namespace pykd {
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
DebugClientPtr g_dbgClient( new DebugClient ); DebugClientPtr g_dbgClient( DebugClient::createDbgClient() );
void loadDump( const std::wstring &fileName ) { void loadDump( const std::wstring &fileName ) {
g_dbgClient->loadDump( fileName ); g_dbgClient->loadDump( fileName );
@ -27,12 +26,21 @@ void attachKernel( const std::wstring &param ) {
g_dbgClient->attachKernel( param ); g_dbgClient->attachKernel( param );
} }
///////////////////////////////////////////////////////////////////////////////////
DebugClientPtr DebugClient::setDbgClientCurrent( DebugClientPtr newDbgClient ) {
DebugClientPtr oldClient = g_dbgClient;
g_dbgClient = newDbgClient;
return oldClient;
}
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
DebugClient::DebugClient() DebugClient::DebugClient()
{ {
HRESULT hres; HRESULT hres;
hres = DebugCreate( __uuidof(IDebugClient4), (void **)&m_client ); hres = DebugCreate( __uuidof(IDebugClient5), (void **)&m_client );
if ( FAILED( hres ) ) if ( FAILED( hres ) )
throw DbgException("DebugCreate failed"); throw DbgException("DebugCreate failed");
@ -47,6 +55,25 @@ DebugClient::DebugClient()
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
DebugClient::DebugClient( IDebugClient4 *client )
{
HRESULT hres;
hres = client->QueryInterface( __uuidof(IDebugClient5), (void**)&m_client );
if ( FAILED( hres ) )
throw DbgException("QueryInterface IDebugControl4 failed");
hres = client->QueryInterface( __uuidof(IDebugControl4), (void**)&m_control );
if ( FAILED( hres ) )
throw DbgException("QueryInterface IDebugControl4 failed");
hres = client->QueryInterface( __uuidof(IDebugSymbols3), (void**)&m_symbols );
if ( FAILED( hres ) )
throw DbgException("QueryInterface IDebugSymbols3 failed");
}
///////////////////////////////////////////////////////////////////////////////////
void DebugClient::loadDump( const std::wstring &fileName ) void DebugClient::loadDump( const std::wstring &fileName )
{ {
HRESULT hres; HRESULT hres;

View File

@ -24,8 +24,6 @@ class DebugClient {
public: public:
DebugClient();
virtual ~DebugClient() {} virtual ~DebugClient() {}
static static
@ -33,6 +31,14 @@ public:
return DebugClientPtr( new DebugClient() ); return DebugClientPtr( new DebugClient() );
} }
static
DebugClientPtr createDbgClient( IDebugClient4 *client ) {
return DebugClientPtr( new DebugClient(client) );
}
static
DebugClientPtr setDbgClientCurrent( DebugClientPtr newDbgClient );
void loadDump( const std::wstring &fileName ); void loadDump( const std::wstring &fileName );
void startProcess( const std::wstring &processName ); void startProcess( const std::wstring &processName );
@ -53,13 +59,15 @@ public:
private: private:
DebugClient();
DebugClient( IDebugClient4 *client );
CComPtr<IDebugClient5> m_client; CComPtr<IDebugClient5> m_client;
CComPtr<IDebugControl4> m_control; CComPtr<IDebugControl4> m_control;
CComPtr<IDebugSymbols3> m_symbols; CComPtr<IDebugSymbols3> m_symbols;
}; };
///////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////
extern DebugClientPtr g_dbgClient; extern DebugClientPtr g_dbgClient;

File diff suppressed because it is too large Load Diff

View File

@ -152,6 +152,16 @@ Module::reloadSymbols()
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
TypeInfo
Module::getTypeByName( const std::string typeName )
{
pyDia::SymbolPtr typeSym = m_dia->getChildByName( typeName );
return TypeInfo( typeSym );
}
///////////////////////////////////////////////////////////////////////////////////
}; // end of namespace pykd }; // end of namespace pykd

View File

@ -4,6 +4,7 @@
#include "dbgobj.h" #include "dbgobj.h"
#include "diawrapper.h" #include "diawrapper.h"
#include "typeinfo.h"
namespace pykd { namespace pykd {
@ -65,6 +66,7 @@ public:
return sym->getRva(); return sym->getRva();
} }
TypeInfo getTypeByName( const std::string typeName );
private: private:

View File

@ -467,6 +467,10 @@
RelativePath=".\stdafx.h" RelativePath=".\stdafx.h"
> >
</File> </File>
<File
RelativePath=".\typeinfo.h"
>
</File>
<File <File
RelativePath=".\utils.h" RelativePath=".\utils.h"
> >

View File

@ -23,7 +23,7 @@ def getTestSuite( singleName = "" ):
[ unittest.TestLoader().loadTestsFromTestCase( basetest.BaseTest ), [ unittest.TestLoader().loadTestsFromTestCase( basetest.BaseTest ),
unittest.TestLoader().loadTestsFromTestCase( moduletest.ModuleTest ), unittest.TestLoader().loadTestsFromTestCase( moduletest.ModuleTest ),
unittest.TestLoader().loadTestsFromTestCase( diatest.DiaTest ), unittest.TestLoader().loadTestsFromTestCase( diatest.DiaTest ),
# unittest.TestLoader().loadTestsFromTestCase( typeinfo.TypeInfoTest ), unittest.TestLoader().loadTestsFromTestCase( typeinfo.TypeInfoTest ),
# unittest.TestLoader().loadTestsFromTestCase( regtest.CpuRegTest ) # unittest.TestLoader().loadTestsFromTestCase( regtest.CpuRegTest )
] ) ] )
else: else:

View File

@ -2,78 +2,19 @@
# #
# #
#import unittest import unittest
#import pykd import target
#import target import pykd
class TypeInfoTest( unittest.TestCase ):
#class TypeInfoTest( unittest.TestCase ): def testCtor( self ):
""" typeInfo class can not be created direct """
try: pykd.typeInfo()
except RuntimeError: pass
def testCreateByName( self ):
""" creating typeInfo by the type name """
ti1 = target.module.type( "structTest" )
ti2 = target.module.type( "classChild" )
# def testBasicTypes(self):
# self.assertEqual( pykd.char_t.name(), "char" )
# self.assertEqual( pykd.char_t.size(), 1 )
# self.assertEqual( pykd.uchar_t.name(), "unsigned char" )
# self.assertEqual( pykd.uchar_t.size(), 1 )
# def testSimpleStruct(self):
# ti = pykd.typeInfo( target.moduleName, "Type1" )
# self.assertTrue( hasattr( ti, "field1" ) )
# self.assertTrue( hasattr( ti, "field2" ) )
# self.assertTrue( hasattr( ti, "field3" ) )
# tv = pykd.typedVar( ti, target.module.var1 )
# self.assertEqual( tv.field1, -121 )
# self.assertEqual( tv.field2, 220 )
# self.assertLess( tv.field3 - 1.0095, 0.0001 )
# def testEnumField(self):
# ti = pykd.typeInfo( target.moduleName, "Type2" )
# self.assertEqual( hasattr( ti, "field1" ), True )
# tv = pykd.typedVar( ti, target.module.var2 )
# self.assertEqual( tv.field1, 100 )
# def testNamespace(self):
# ti1 = pykd.typeInfo( target.moduleName, "Namespace1::Class1" )
# ti2 = pykd.typeInfo( target.moduleName, "Namespace1::Namespace2::Class2" )
# var3 = pykd.typedVar( ti1, pykd.getOffset( target.moduleName, "Namespace1::var3" ) )
# var4 = pykd.typedVar( ti1, pykd.getOffset( target.moduleName, "Namespace1::Namespace2::var4" ) )
# self.assertEqual( var3.m_field1, 50 )
# def testTemplates(self):
# ti3 = pykd.typeInfo( target.moduleName, "Namespace3::Class3<int>" )
# var5 = pykd.typedVar( ti3, pykd.getOffset( target.moduleName, "Namespace3::var5" ) )
# self.assertEqual( var5.m_field1, 5 )
# def testNestedStruct(self):
# ti4 = pykd.typeInfo( target.moduleName, "Type4" )
# self.assertTrue( hasattr( ti4, "field1" ) )
# self.assertTrue( hasattr( ti4, "field2" ) )
# self.assertTrue( hasattr( ti4, "field3" ) )
# self.assertTrue( hasattr( ti4, "field4" ) )
# self.assertTrue( hasattr( ti4, "field4" ) )
# self.assertTrue( hasattr( ti4.field4, "field41" ) )
# def testPtrField(self):
# v6 = pykd.typedVar( target.moduleName, "Type6", pykd.getOffset( target.moduleName, "var6" ) )
# self.assertEqual( v6.field1, 10 )
# self.assertEqual( v6.field2.field1, 10 )
# self.assertEqual( v6.field2.field2, 20 )
# self.assertNotEqual( v6.field2, 0 )
# self.assertEqual( v6.field3[0].field1, 10 )
# self.assertEqual( v6.field3[1].field2, 20 )
# def testArrayField(self):
# v7 = pykd.typedVar( target.moduleName, "Type7", pykd.getOffset( target.moduleName, "var7" ) )
# self.assertEqual( v7.field1[1].field1, 10 )
# self.assertEqual( v7.field1[5].field2, 20 )
# self.assertEqual( v7.field2[1][0].field1, 10 )
# self.assertEqual( v7.field2[0][1].field2, 20 )
# def testTypedVarByAddress(self):
# var5 = pykd.typedVar( pykd.getOffset( target.moduleName, "Namespace3::var5" ) )
# self.assertEqual( var5.m_field1, 5 )
# def testTypedVarBySymbolName(self):
# var5 = pykd.typedVar( "Namespace3::var5" )
# self.assertEqual( var5.m_field1, 5 )