mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-20 03:23:23 +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 ) {
|
void loadDump( const std::wstring &fileName ) {
|
||||||
g_dbgClient->loadDump( fileName );
|
g_dbgClient->loadDump( fileName );
|
||||||
@ -27,12 +26,21 @@ void attachKernel( const std::wstring ¶m ) {
|
|||||||
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;
|
||||||
|
@ -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;
|
||||||
|
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
|
}; // end of namespace pykd
|
||||||
|
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
|
||||||
|
@ -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"
|
||||||
>
|
>
|
||||||
|
@ -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:
|
||||||
|
@ -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 )
|
|
||||||
|
Loading…
Reference in New Issue
Block a user