mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-19 19:13:22 +08:00
[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:
parent
7fb30a9912
commit
f86dca719a
@ -8,8 +8,7 @@ namespace pykd {
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
DebugClientPtr g_dbgClient( new DebugClient );
|
||||
|
||||
DebugClientPtr g_dbgClient( DebugClient::createDbgClient() );
|
||||
|
||||
void loadDump( const std::wstring &fileName ) {
|
||||
g_dbgClient->loadDump( fileName );
|
||||
@ -27,12 +26,21 @@ void attachKernel( const std::wstring ¶m ) {
|
||||
g_dbgClient->attachKernel( param );
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
DebugClientPtr DebugClient::setDbgClientCurrent( DebugClientPtr newDbgClient ) {
|
||||
DebugClientPtr oldClient = g_dbgClient;
|
||||
g_dbgClient = newDbgClient;
|
||||
return oldClient;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
DebugClient::DebugClient()
|
||||
{
|
||||
HRESULT hres;
|
||||
hres = DebugCreate( __uuidof(IDebugClient4), (void **)&m_client );
|
||||
hres = DebugCreate( __uuidof(IDebugClient5), (void **)&m_client );
|
||||
if ( FAILED( hres ) )
|
||||
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 )
|
||||
{
|
||||
HRESULT hres;
|
||||
|
@ -24,8 +24,6 @@ class DebugClient {
|
||||
|
||||
public:
|
||||
|
||||
DebugClient();
|
||||
|
||||
virtual ~DebugClient() {}
|
||||
|
||||
static
|
||||
@ -33,6 +31,14 @@ public:
|
||||
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 startProcess( const std::wstring &processName );
|
||||
@ -53,13 +59,15 @@ public:
|
||||
|
||||
private:
|
||||
|
||||
DebugClient();
|
||||
|
||||
DebugClient( IDebugClient4 *client );
|
||||
|
||||
CComPtr<IDebugClient5> m_client;
|
||||
CComPtr<IDebugControl4> m_control;
|
||||
CComPtr<IDebugSymbols3> m_symbols;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
extern DebugClientPtr g_dbgClient;
|
||||
|
1302
pykd/dbgext.cpp
1302
pykd/dbgext.cpp
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
|
||||
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
#include "dbgobj.h"
|
||||
#include "diawrapper.h"
|
||||
#include "typeinfo.h"
|
||||
|
||||
namespace pykd {
|
||||
|
||||
@ -65,6 +66,7 @@ public:
|
||||
return sym->getRva();
|
||||
}
|
||||
|
||||
TypeInfo getTypeByName( const std::string typeName );
|
||||
|
||||
private:
|
||||
|
||||
|
@ -467,6 +467,10 @@
|
||||
RelativePath=".\stdafx.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\typeinfo.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\utils.h"
|
||||
>
|
||||
|
@ -23,7 +23,7 @@ def getTestSuite( singleName = "" ):
|
||||
[ unittest.TestLoader().loadTestsFromTestCase( basetest.BaseTest ),
|
||||
unittest.TestLoader().loadTestsFromTestCase( moduletest.ModuleTest ),
|
||||
unittest.TestLoader().loadTestsFromTestCase( diatest.DiaTest ),
|
||||
# unittest.TestLoader().loadTestsFromTestCase( typeinfo.TypeInfoTest ),
|
||||
unittest.TestLoader().loadTestsFromTestCase( typeinfo.TypeInfoTest ),
|
||||
# unittest.TestLoader().loadTestsFromTestCase( regtest.CpuRegTest )
|
||||
] )
|
||||
else:
|
||||
|
@ -2,78 +2,19 @@
|
||||
#
|
||||
#
|
||||
|
||||
#import unittest
|
||||
#import pykd
|
||||
#import target
|
||||
import unittest
|
||||
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 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 testCreateByName( self ):
|
||||
""" creating typeInfo by the type name """
|
||||
ti1 = target.module.type( "structTest" )
|
||||
ti2 = target.module.type( "classChild" )
|
||||
|
||||
# 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 )
|
||||
|
Loading…
Reference in New Issue
Block a user