From 6d33eb52860a90ede61f44ce823b20dd6c662237 Mon Sep 17 00:00:00 2001 From: "SND\\kernelnet_cp" Date: Wed, 16 Nov 2011 09:20:41 +0000 Subject: [PATCH] [0.1.x] added : breakin routine git-svn-id: https://pykd.svn.codeplex.com/svn@71390 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/dbgclient.h | 2 + pykd/dbgcmd.cpp | 166 ++++++----------------------------------------- pykd/dbgext.cpp | 16 +++-- 3 files changed, 35 insertions(+), 149 deletions(-) diff --git a/pykd/dbgclient.h b/pykd/dbgclient.h index df2af70..d34f465 100644 --- a/pykd/dbgclient.h +++ b/pykd/dbgclient.h @@ -44,6 +44,8 @@ public: ULONG64 addr64( ULONG64 addr ); + void breakin(); + DbgOut dout() { return DbgOut( m_client ); } diff --git a/pykd/dbgcmd.cpp b/pykd/dbgcmd.cpp index ceecc02..92759e5 100644 --- a/pykd/dbgcmd.cpp +++ b/pykd/dbgcmd.cpp @@ -132,149 +132,25 @@ evaluate( const std::wstring &expression ) ///////////////////////////////////////////////////////////////////////////////// +void DebugClient::breakin() +{ + HRESULT hres; + + PyThreadState *pystate = PyEval_SaveThread(); + + hres = m_control->SetInterrupt( DEBUG_INTERRUPT_ACTIVE ); + + PyEval_RestoreThread( pystate ); + + if ( FAILED( hres ) ) + throw DbgException( "IDebugControl::SetInterrupt" ); +} + +void breakin() +{ + g_dbgClient->breakin(); +} + +///////////////////////////////////////////////////////////////////////////////// + } // end namespace pykd - - - - - - - - - - - -//#include -// -//#include "dbgext.h" -//#include "dbgcmd.h" -//#include "dbgexcept.h" -//#include "dbgio.h" -//#include "dbgsystem.h" - - - - - -///////////////////////////////////////////////////////////////////////////////// -// -//std::string -//dbgCommand( const std::wstring &command ) -//{ -// HRESULT hres; -// -// OutputReader outReader( dbgExt->client ); -// { -// PyThread_StateRestore pyThreadRestore; -// -// hres = dbgExt->control4->ExecuteWide( DEBUG_OUTCTL_THIS_CLIENT, command.c_str(), 0 ); -// } -// if ( FAILED( hres ) ) -// throw DbgException( "IDebugControl::Execute failed" ); -// -// return std::string( outReader.Line() ); -//} -// -///////////////////////////////////////////////////////////////////////////////// -// -//dbgExtensionClass::dbgExtensionClass( const char* path ) : m_path(path) -//{ -// HRESULT hres; -// -// hres = dbgExt->control->AddExtension( path, 0, &m_handle ); -// if ( FAILED( hres ) ) -// throw DbgException( "IDebugControl::AddExtension failed" ); -//} -// -///////////////////////////////////////////////////////////////////////////////// -// -//dbgExtensionClass::~dbgExtensionClass() -//{ -// if ( m_handle ) -// dbgExt->control->RemoveExtension( m_handle ); -//} -// -///////////////////////////////////////////////////////////////////////////////// -// -//std::string -//dbgExtensionClass::call( const std::string &command, const std::string params ) -//{ -// HRESULT hres; -// -// OutputReader outReader( dbgExt->client ); -// -// hres = dbgExt->control->CallExtension( m_handle, command.c_str(), params.c_str() ); -// if ( FAILED( hres ) ) -// throw DbgException( "IDebugControl::CallExtension failed" ); -// -// return std::string( outReader.Line() ); -//} -// -///////////////////////////////////////////////////////////////////////////////// -// -//std::string -//dbgExtensionClass::print() const -//{ -// return m_handle ? m_path : ""; -//} -// -///////////////////////////////////////////////////////////////////////////////// -// -//ULONG64 -//evaluate( const std::string &expression ) -//{ -// HRESULT hres; -// ULONG64 value = 0; -// -// DEBUG_VALUE debugValue = {}; -// ULONG remainderIndex = 0; -// -// if ( is64bitSystem() ) -// { -// hres = dbgExt->control->Evaluate( -// expression.c_str(), -// DEBUG_VALUE_INT64, -// &debugValue, -// &remainderIndex ); -// -// if ( FAILED( hres ) ) -// throw DbgException( "IDebugControl::Evaluate failed" ); -// -// if ( remainderIndex == expression.length() ) -// value = debugValue.I64; -// } -// else -// { -// hres = dbgExt->control->Evaluate( -// expression.c_str(), -// DEBUG_VALUE_INT32, -// &debugValue, -// &remainderIndex ); -// -// if ( FAILED( hres ) ) -// throw DbgException( "IDebugControl::Evaluate failed" ); -// -// if ( remainderIndex == expression.length() ) -// value = debugValue.I32; -// } -// -// return value; -//} -// -///////////////////////////////////////////////////////////////////////////////// -// -//void -//breakin() -//{ -// HRESULT hres; -// -// { -// PyThread_StateRestore pyThreadRestore; -// hres = dbgExt->control->SetInterrupt( DEBUG_INTERRUPT_ACTIVE ); -// } -// -// if ( FAILED( hres ) ) -// throw DbgException( "IDebugControl::SetInterrupt" ); -//} -// -///////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/pykd/dbgext.cpp b/pykd/dbgext.cpp index 4cd38f0..a397884 100644 --- a/pykd/dbgext.cpp +++ b/pykd/dbgext.cpp @@ -166,13 +166,17 @@ BOOST_PYTHON_MODULE( pykd ) .def( "__hex__", &intBase::hex ); python::class_("dbgClient", "Class representing a debugging session", python::no_init ) - .def( "loadDump", &pykd::DebugClient::loadDump, + .def( "addr64", &DebugClient::addr64, + "Extend address to 64 bits formats" ) + .def( "breakin", &DebugClient::breakin, + "Break into debugger" ) + .def( "loadDump", &DebugClient::loadDump, "Load crash dump" ) - .def( "startProcess", &pykd::DebugClient::startProcess, + .def( "startProcess", &DebugClient::startProcess, "Start process for debugging" ) - .def( "attachProcess", &pykd::DebugClient::attachProcess, + .def( "attachProcess", &DebugClient::attachProcess, "Attach debugger to a exsisting process" ) - .def( "attachKernel", &pykd::DebugClient::attachKernel, + .def( "attachKernel", &DebugClient::attachKernel, "Attach debugger to a target's kernel" ) .def( "expr", &pykd::DebugClient::evaluate, "Evaluate windbg expression" ) @@ -251,6 +255,10 @@ BOOST_PYTHON_MODULE( pykd ) .def( "waitForEvent", &pykd::DebugClient::waitForEvent, "Wait for events that breaks into the debugger" ); + python::def( "addr64", &addr64, + "Extend address to 64 bits formats" ); + python::def( "breakin", &breakin, + "Break into debugger" ); python::def( "createDbgClient", (DebugClientPtr(*)())&pykd::DebugClient::createDbgClient, "create a new instance of the dbgClient class" ); python::def( "loadDump", &pykd::loadDump,