From 487b4a8f6d6d5bb7fbaa764a2260302f14ceabf9 Mon Sep 17 00:00:00 2001 From: "SND\\EreTIk_cp" Date: Sun, 22 Jul 2012 15:23:18 +0000 Subject: [PATCH] [0.1.x] +reset for EventHandler git-svn-id: https://pykd.svn.codeplex.com/svn@78241 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/dbgclient.cpp | 4 ++-- pykd/dbgevent.cpp | 1 - pykd/dbgevent.h | 11 ++++++----- pykd/pykd_2008.vcproj | 6 +----- pykd/pymod.cpp | 3 ++- test/scripts/basetest.py | 4 ++-- test/scripts/ehloadtest.py | 27 ++++++++++++++------------- test/scripts/pykdtest.py | 27 ++++++++++++++++++--------- test/scripts/testutils.py | 16 ++++++++++++++++ test/targetapp/targetapp.vcproj | 10 +++++----- 10 files changed, 66 insertions(+), 43 deletions(-) create mode 100644 test/scripts/testutils.py diff --git a/pykd/dbgclient.cpp b/pykd/dbgclient.cpp index 9aecc37..f057c02 100644 --- a/pykd/dbgclient.cpp +++ b/pykd/dbgclient.cpp @@ -426,10 +426,10 @@ ULONG ptrSize() void DebugClient::terminateProcess() { HRESULT hres; - + hres = m_client->TerminateCurrentProcess(); if ( FAILED( hres ) ) - throw DbgException( "IDebugClient::TerminateCurrentProcess failed" ); + throw DbgException( "IDebugClient::TerminateCurrentProcess", hres ); } void terminateProcess() diff --git a/pykd/dbgevent.cpp b/pykd/dbgevent.cpp index 3817522..966e954 100644 --- a/pykd/dbgevent.cpp +++ b/pykd/dbgevent.cpp @@ -50,7 +50,6 @@ EventHandler::EventHandler( DebugClientPtr &client ) EventHandler::~EventHandler() { - m_handlerClient->SetEventCallbacks( NULL ); } //////////////////////////////////////////////////////////////////////////////// diff --git a/pykd/dbgevent.h b/pykd/dbgevent.h index 0ca7cff..6faa3aa 100644 --- a/pykd/dbgevent.h +++ b/pykd/dbgevent.h @@ -17,13 +17,16 @@ namespace pykd { class EventHandler : public DebugBaseEventCallbacks { public: - EventHandler(); EventHandler( DebugClientPtr &client ); virtual ~EventHandler(); + void reset() { + m_handlerClient.Release(); + } + protected: STDMETHOD_(ULONG, AddRef)() { return 1; } @@ -67,7 +70,6 @@ protected: protected: - virtual ULONG onBreakpoint(ULONG Id) = 0; virtual ULONG onException(const python::dict &/*exceptData*/) = 0; @@ -75,13 +77,12 @@ protected: virtual ULONG onLoadModule(const ModulePtr &/* module */) = 0; virtual ULONG onUnloadModule(ULONG64 /*modBase*/) = 0; - + virtual ULONG onChangeSessionStatus( ULONG status ) = 0; - + virtual ULONG onChangeDebugeeState() = 0; protected: - CComPtr m_handlerClient; DebugClientPtr m_parentClient; diff --git a/pykd/pykd_2008.vcproj b/pykd/pykd_2008.vcproj index a4ec4bc..c0ab5c4 100644 --- a/pykd/pykd_2008.vcproj +++ b/pykd/pykd_2008.vcproj @@ -1,14 +1,10 @@ diff --git a/pykd/pymod.cpp b/pykd/pymod.cpp index 8c609a6..c1d9753 100644 --- a/pykd/pymod.cpp +++ b/pykd/pymod.cpp @@ -652,7 +652,8 @@ BOOST_PYTHON_MODULE( pykd ) python::class_( "eventHandler", "Base class for overriding and handling debug notifications" ) .def( python::init<>() ) - .def( python::init() ) + .def( "reset", &pykd::EventHandler::reset, + "Reset event handler" ) .def( "onBreakpoint", &pykd::EventHandlerWrap::onBreakpoint, "Triggered breakpoint event. Parameter is int: ID of breakpoint\n" "For ignore event method must return DEBUG_STATUS_NO_CHANGE value" ) diff --git a/test/scripts/basetest.py b/test/scripts/basetest.py index dba720f..fd2f3db 100644 --- a/test/scripts/basetest.py +++ b/test/scripts/basetest.py @@ -112,7 +112,7 @@ class BaseTest( unittest.TestCase ): def testNewAddededApi( self ): """ Branch test: new API 0.1.x what must be available """ - self.assertTrue( hasattr(pykd, 'createDbgClient') ) + # self.assertTrue( hasattr(pykd, 'createDbgClient') ) self.assertTrue( hasattr(pykd, 'detachProcess') ) self.assertTrue( hasattr(pykd, 'diaLoadPdb') ) self.assertTrue( hasattr(pykd, 'getDebuggeeType' ) ) @@ -131,7 +131,7 @@ class BaseTest( unittest.TestCase ): self.assertTrue( hasattr(pykd, 'DiaException') ) self.assertTrue( hasattr(pykd, 'DiaScope') ) self.assertTrue( hasattr(pykd, 'DiaSymbol') ) - self.assertTrue( hasattr(pykd, 'dbgClient') ) + # self.assertTrue( hasattr(pykd, 'dbgClient') ) self.assertTrue( hasattr(pykd, 'din') ) self.assertTrue( hasattr(pykd, 'dout') ) self.assertTrue( hasattr(pykd, 'eventHandler' ) ) diff --git a/test/scripts/ehloadtest.py b/test/scripts/ehloadtest.py index 2a0915f..437cc86 100644 --- a/test/scripts/ehloadtest.py +++ b/test/scripts/ehloadtest.py @@ -4,11 +4,12 @@ import unittest import target import pykd import fnmatch +import testutils class ModuleLoadHandler(pykd.eventHandler): """Track load/unload module implementation""" - def __init__(self, client, moduleMask): - pykd.eventHandler.__init__(self, client) + def __init__(self, moduleMask): + pykd.eventHandler.__init__(self) self.moduleMask = moduleMask.lower() @@ -36,16 +37,16 @@ class EhLoadTest(unittest.TestCase): def testLoadUnload(self): """Start new process and track loading and unloading modules""" - testClient = pykd.createDbgClient() - testClient.startProcess( target.appPath + " -testLoadUnload" ) + pykd.startProcess(target.appPath + " -testLoadUnload") + with testutils.ContextCallIt( pykd.killProcess ) as contextCallIt: + modLoadHandler = ModuleLoadHandler( "*Iphlpapi*" ) + with testutils.ContextCallIt( getattr(modLoadHandler, "reset") ) as resetEventHandler: + try: + while True: + pykd.go() + except pykd.WaitEventException: + pass - modLoadHandler = ModuleLoadHandler( testClient, "*Iphlpapi*" ) - try: - while True: - testClient.go() - except pykd.WaitEventException: - pass - - self.assertTrue(modLoadHandler.wasLoad) - self.assertTrue(modLoadHandler.wasUnload) + self.assertTrue(modLoadHandler.wasLoad) + self.assertTrue(modLoadHandler.wasUnload) diff --git a/test/scripts/pykdtest.py b/test/scripts/pykdtest.py index fc10752..535ca32 100644 --- a/test/scripts/pykdtest.py +++ b/test/scripts/pykdtest.py @@ -43,14 +43,19 @@ def getTestSuite( singleName = "" ): unittest.TestLoader().loadTestsFromTestCase( intbase.IntBaseTest ), unittest.TestLoader().loadTestsFromTestCase( synsymtest.SynSymTest ), unittest.TestLoader().loadTestsFromTestCase( thrdctxtest.ThreadContextTest ), - unittest.TestLoader().loadTestsFromTestCase( ehloadtest.EhLoadTest ), - unittest.TestLoader().loadTestsFromTestCase( localstest.LocalVarsTest ), - unittest.TestLoader().loadTestsFromTestCase( ehexcepttest.EhExceptionBreakpointTest ), unittest.TestLoader().loadTestsFromTestCase( regtest.CpuRegTest ), ] ) else: return unittest.TestSuite( unittest.TestLoader().loadTestsFromName( singleName ) ) +def getNewProcessTestSuite(): + return unittest.TestSuite( + [ + unittest.TestLoader().loadTestsFromTestCase( ehloadtest.EhLoadTest ), + # unittest.TestLoader().loadTestsFromTestCase( localstest.LocalVarsTest ), + # unittest.TestLoader().loadTestsFromTestCase( ehexcepttest.EhExceptionBreakpointTest ), + ] ) + if __name__ == "__main__": @@ -70,12 +75,16 @@ if __name__ == "__main__": print "" - suite = getTestSuite() - #suite = getTestSuite( "diatest.DiaTest.testFind" ) - #suite = getTestSuite( "typedvar.TypedVarTest.testTypeVarArg" ) - #suite = getTestSuite( "typeinfo.TypeInfoTest.testCreateByName" ) - #suite = getTestSuite( "typedvar.TypedVarTest.testBitField" ) + oneProcessTests = getTestSuite() + #oneProcessTests = getTestSuite( "diatest.DiaTest.testFind" ) + #oneProcessTests = getTestSuite( "typedvar.TypedVarTest.testTypeVarArg" ) + #oneProcessTests = getTestSuite( "typeinfo.TypeInfoTest.testCreateByName" ) + #oneProcessTests = getTestSuite( "typedvar.TypedVarTest.testBitField" ) - unittest.TextTestRunner(stream=sys.stdout, verbosity=2).run( suite ) + unittest.TextTestRunner(stream=sys.stdout, verbosity=2).run( oneProcessTests ) + + pykd.killProcess() + + unittest.TextTestRunner(stream=sys.stdout, verbosity=2).run( getNewProcessTestSuite() ) raw_input("\npress return\n") diff --git a/test/scripts/testutils.py b/test/scripts/testutils.py new file mode 100644 index 0000000..e07d47e --- /dev/null +++ b/test/scripts/testutils.py @@ -0,0 +1,16 @@ +"""PyKd test heplers/wrappers""" + +import pykd + +class ContextCallIt: + """Context manager/with statement""" + def __init__(self, callIt): + self.callIt = callIt + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, exc_tb): + try: self.callIt() + except: pass + diff --git a/test/targetapp/targetapp.vcproj b/test/targetapp/targetapp.vcproj index a03833a..11ad401 100644 --- a/test/targetapp/targetapp.vcproj +++ b/test/targetapp/targetapp.vcproj @@ -1,14 +1,10 @@ @@ -460,6 +456,10 @@ RelativePath="..\scripts\target.py" > + +