diff --git a/pykd/packages.pykd_vc120.config b/pykd/packages.pykd_vc120.config index ceb9eb5..a29ebfd 100644 --- a/pykd/packages.pykd_vc120.config +++ b/pykd/packages.pykd_vc120.config @@ -1,6 +1,10 @@  + + + + \ No newline at end of file diff --git a/pykd/pycpucontext.h b/pykd/pycpucontext.h index 0763d93..8ea2eed 100644 --- a/pykd/pycpucontext.h +++ b/pykd/pycpucontext.h @@ -108,6 +108,11 @@ inline kdlib::StackFramePtr getCurrentFrame() { return kdlib::getCurrentStackFrame(); } +inline unsigned long getCurrentFrameNumber() { + AutoRestorePyState pystate; + return kdlib::getCurrentStackFrameNumber(); +} + inline void setCurrentFrame( kdlib::StackFramePtr& stackFrame) { AutoRestorePyState pystate; kdlib::setCurrentStackFrame(stackFrame); diff --git a/pykd/pyeventhandler.cpp b/pykd/pyeventhandler.cpp index 66e47b1..7da46a5 100644 --- a/pykd/pyeventhandler.cpp +++ b/pykd/pyeventhandler.cpp @@ -286,6 +286,28 @@ void EventHandler::onChangeLocalScope() ///////////////////////////////////////////////////////////////////////////////// +void EventHandler::onChangeBreakpoints() +{ + PyEval_RestoreThread(m_pystate); + + try { + + python::override pythonHandler = get_override("onChangeBreakpoints"); + if (pythonHandler) + { + pythonHandler(); + } + } + catch (const python::error_already_set &) + { + printException(); + } + + m_pystate = PyEval_SaveThread(); +} + +///////////////////////////////////////////////////////////////////////////////// + void EventHandler::onDebugOutput(const std::wstring& text) { PyEval_RestoreThread( m_pystate ); diff --git a/pykd/pyeventhandler.h b/pykd/pyeventhandler.h index ebdb7fa..e5db4c7 100644 --- a/pykd/pyeventhandler.h +++ b/pykd/pyeventhandler.h @@ -35,6 +35,7 @@ public: virtual kdlib::DebugCallbackResult onModuleUnload( kdlib::MEMOFFSET_64 offset, const std::wstring &name ); virtual void onCurrentThreadChange(kdlib::THREAD_DEBUG_ID threadid); virtual void onChangeLocalScope(); + virtual void onChangeBreakpoints(); virtual void onDebugOutput(const std::wstring& text); private: diff --git a/pykd/pykd_vc120.vcxproj b/pykd/pykd_vc120.vcxproj index 9d7fcf8..854bba2 100644 --- a/pykd/pykd_vc120.vcxproj +++ b/pykd/pykd_vc120.vcxproj @@ -69,7 +69,7 @@ - 445589a8 + 50e91edb true diff --git a/pykd/pykd_vc120.vcxproj.filters b/pykd/pykd_vc120.vcxproj.filters index 146649a..f125f69 100644 --- a/pykd/pykd_vc120.vcxproj.filters +++ b/pykd/pykd_vc120.vcxproj.filters @@ -113,6 +113,105 @@ Source Files + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + diff --git a/pykd/pymod.cpp b/pykd/pymod.cpp index 713cb3c..4e34eff 100644 --- a/pykd/pymod.cpp +++ b/pykd/pymod.cpp @@ -355,6 +355,8 @@ BOOST_PYTHON_MODULE( pykd ) "Return a current stack as a list of stackFrame objects" ); python::def( "getFrame", pykd::getCurrentFrame, "Return a current stack frame" ); + python::def("getFrameNumber", pykd::getCurrentFrameNumber, + "Return current frame number"); python::def( "setFrame", pykd::setCurrentFrame, "Change current local scope" ); python::def( "setFrame", pykd::setCurrentFrameByIndex, @@ -901,6 +903,8 @@ BOOST_PYTHON_MODULE( pykd ) .def( "onChangeLocalScope", &EventHandler::onChangeLocalScope, "The current local scope has been changed.\n" "There is no return value" ) + .def("onChangeBreakpoints", &EventHandler::onChangeBreakpoints, + "Breakpoints is changed for current process" ) .def( "onDebugOutput", &EventHandler::onDebugOutput, "Request debug output" );