diff --git a/pykd/pyeventhandler.cpp b/pykd/pyeventhandler.cpp index 90e0e69..99cb0a9 100644 --- a/pykd/pyeventhandler.cpp +++ b/pykd/pyeventhandler.cpp @@ -384,28 +384,18 @@ void breakPointRemove( kdlib::BREAKPOINT_ID id ) /////////////////////////////////////////////////////////////////////////////// -kdlib::BreakpointPtr Breakpoint::setSoftwareBreakpoint( kdlib::MEMOFFSET_64 offset ) +Breakpoint::Breakpoint( kdlib::MEMOFFSET_64 offset ) { - Breakpoint *bp = new Breakpoint(); - - AutoRestorePyState pystate(&bp->m_pystate); - - bp->set(offset); - - return kdlib::BreakpointPtr(bp); + AutoRestorePyState pystate(&m_pystate); + set(offset); } /////////////////////////////////////////////////////////////////////////////// -kdlib::BreakpointPtr Breakpoint::setHardwareBreakpoint( kdlib::MEMOFFSET_64 offset, size_t size, kdlib::ACCESS_TYPE accessType ) +Breakpoint::Breakpoint( kdlib::MEMOFFSET_64 offset, size_t size, kdlib::ACCESS_TYPE accessType ) { - Breakpoint *bp = new Breakpoint(); - - AutoRestorePyState pystate(&bp->m_pystate); - - bp->set(offset, size, accessType); - - return kdlib::BreakpointPtr(bp); + AutoRestorePyState pystate(&m_pystate); + set(offset, size, accessType); } /////////////////////////////////////////////////////////////////////////////// diff --git a/pykd/pyeventhandler.h b/pykd/pyeventhandler.h index 6e16c90..a451ed5 100644 --- a/pykd/pyeventhandler.h +++ b/pykd/pyeventhandler.h @@ -21,8 +21,6 @@ namespace pykd { /////////////////////////////////////////////////////////////////////////////// -class EventHandler; -typedef boost::shared_ptr EventHandlerPtr; class EventHandler : public python::wrapper, public kdlib::EventHandler { @@ -48,17 +46,17 @@ kdlib::BREAKPOINT_ID setHardwareBreakpoint( kdlib::MEMOFFSET_64 offset, size_t s void breakPointRemove( kdlib::BREAKPOINT_ID id ); -class Breakpoint : public python::wrapper, public kdlib::BaseBreakpoint { +class Breakpoint : public python::wrapper, public kdlib::BaseBreakpoint { public: - static kdlib::BreakpointPtr setSoftwareBreakpoint( kdlib::MEMOFFSET_64 offset ); - static kdlib::BreakpointPtr setHardwareBreakpoint( kdlib::MEMOFFSET_64 offset, size_t size, kdlib::ACCESS_TYPE accessType ); + Breakpoint( kdlib::MEMOFFSET_64 offset ); + Breakpoint( kdlib::MEMOFFSET_64 offset, size_t size, kdlib::ACCESS_TYPE accessType ); + + virtual kdlib::DebugCallbackResult onHit(); private: - kdlib::DebugCallbackResult onHit(); - PyThreadState* m_pystate; }; diff --git a/pykd/pykdver.h b/pykd/pykdver.h index c6286f1..0a5fe29 100644 --- a/pykd/pykdver.h +++ b/pykd/pykdver.h @@ -2,7 +2,7 @@ #define PYKD_VERSION_MAJOR 0 #define PYKD_VERSION_MINOR 3 #define PYKD_VERSION_SUBVERSION 0 -#define PYKD_VERSION_BUILDNO 5 +#define PYKD_VERSION_BUILDNO 6 #define __VER_STR2__(x) #x #define __VER_STR1__(x) __VER_STR2__(x) diff --git a/pykd/pymod.cpp b/pykd/pymod.cpp index ca94b43..ad53be0 100644 --- a/pykd/pymod.cpp +++ b/pykd/pymod.cpp @@ -854,7 +854,7 @@ BOOST_PYTHON_MODULE( pykd ) .value("PageExecuteWriteCopy", kdlib::PageExecuteWriteCopy) .export_values(); - python::class_( + python::class_( "eventHandler", "Base class for overriding and handling debug notifications" ) .def( "onBreakpoint", &EventHandler::onBreakpoint, "Triggered breakpoint event. Parameter is int: ID of breakpoint\n" @@ -879,11 +879,11 @@ BOOST_PYTHON_MODULE( pykd ) // "There is no return value"); ; - python::class_( "breakpoint", + python::class_( "breakpoint", "class for breakpoint representation", python::no_init ) - .def("__init__", python::make_constructor(pykd::Breakpoint::setSoftwareBreakpoint) ) - .def("__init__", python::make_constructor(pykd::Breakpoint::setHardwareBreakpoint) ) - .def("onHit", &kdlib::Breakpoint::onHit, + .def( python::init() ) + .def( python::init() ) + .def("onHit", &Breakpoint::onHit, "Breakpoint hit callback") ; diff --git a/test/scripts/breakpoint.py b/test/scripts/breakpoint.py index bad656c..ed77784 100644 --- a/test/scripts/breakpoint.py +++ b/test/scripts/breakpoint.py @@ -123,15 +123,35 @@ class BreakpointTest( unittest.TestCase ): bp = MyBreakpoint( targetModule.CdeclFunc ) - pykd.setBp( targetModule.CdeclFunc ) - self.assertEqual( pykd.Break, pykd.go() ) self.assertEqual( 1, bp.count ) + def testBreakpointCondition(self): + + def makebpcallback(n): + + def bpcallback(): + if pykd.getParam("b") > n: + return pykd.eventResult.Break + return pykd.eventResult.Proceed + return bpcallback + + processId = pykd.startProcess( target.appPath + " breakhandlertest" ) + targetModule = pykd.module( target.moduleName ) + targetModule.reload() + with testutils.ContextCallIt( testutils.KillProcess(processId) ) as killStartedProcess : + pykd.go() + bp = pykd.setBp( targetModule.CdeclFunc, makebpcallback(1) ) + self.assertEqual( pykd.Break, pykd.go() ) - - + processId = pykd.startProcess( target.appPath + " breakhandlertest" ) + targetModule = pykd.module( target.moduleName ) + targetModule.reload() + with testutils.ContextCallIt( testutils.KillProcess(processId) ) as killStartedProcess : + pykd.go() + bp = pykd.setBp( targetModule.CdeclFunc, makebpcallback(100) ) + self.assertEqual( pykd.NoDebuggee, pykd.go() )