From 322f1a39a667a1e868b06fe57ac4a4732057506a Mon Sep 17 00:00:00 2001 From: "SND\\kernelnet_cp" Date: Thu, 5 Apr 2012 15:39:36 +0000 Subject: [PATCH] [0.1.x] fixed : issue #10532 ( breakpoint callback is not called after quit from !pycmd ) git-svn-id: https://pykd.svn.codeplex.com/svn@75293 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/dbgext.cpp | 17 +++++++++++------ pykd/inteventhandler.cpp | 32 +++++++++++++++----------------- test/scripts/typedvar.py | 2 ++ 3 files changed, 28 insertions(+), 23 deletions(-) diff --git a/pykd/dbgext.cpp b/pykd/dbgext.cpp index c8581b7..109526b 100644 --- a/pykd/dbgext.cpp +++ b/pykd/dbgext.cpp @@ -125,7 +125,7 @@ py( PDEBUG_CLIENT4 client, PCSTR args ) sys.attr("stdin") = python::object( dbgClient->din() ); // импортируем модуль обработки исключений ( нужен для вывода traceback а ) - boost::python::object tracebackModule = python::import("traceback"); + python::object tracebackModule = python::import("traceback"); // разбор параметров typedef boost::escaped_list_separator char_separator_t; @@ -216,8 +216,11 @@ HRESULT CALLBACK pycmd( PDEBUG_CLIENT4 client, PCSTR args ) { - DebugClientPtr dbgClient = DebugClient::createDbgClient( client ); - DebugClientPtr oldClient = DebugClient::setDbgClientCurrent( dbgClient ); + if ( g_dbgClient->client() != client ) + { + DebugClientPtr dbgClient = DebugClient::createDbgClient( client ); + DebugClient::setDbgClientCurrent( dbgClient ); + } WindbgGlobalSession::RestorePyState(); @@ -241,18 +244,20 @@ pycmd( PDEBUG_CLIENT4 client, PCSTR args ) WindbgGlobalSession::global().ptr(), WindbgGlobalSession::global().ptr() ); + + // выход из интерпретатора происходит через исключение raise SystemExit(code) + // которое потом может помешать исполнению callback ов + PyErr_Clear(); } catch(...) { - dbgClient->eprintln( L"unexpected error" ); + //dbgClient->eprintln( L"unexpected error" ); } client->SetOutputMask( mask ); WindbgGlobalSession::SavePyState(); - DebugClient::setDbgClientCurrent( oldClient ); - return S_OK; } diff --git a/pykd/inteventhandler.cpp b/pykd/inteventhandler.cpp index 93647b0..f8688df 100644 --- a/pykd/inteventhandler.cpp +++ b/pykd/inteventhandler.cpp @@ -91,25 +91,23 @@ HRESULT InternalDbgEventHandler::Breakpoint(IDebugBreakpoint *bp) BpCallbackMapIml::iterator it = m_bpCallbacks.m_map.find(Id); if (it != m_bpCallbacks.m_map.end()) { - python::object resObj; - { - PyThread_StateSave pyThreadSave( m_parentClient->getThreadState() ); - try { - resObj = it->second(Id); + PyThread_StateSave pyThreadSave( m_parentClient->getThreadState() ); - python::extract getRetCode( resObj ); - if (getRetCode.check()) - return getRetCode; - } - catch (const python::error_already_set &) { - // TODO: some logging, alerting... - return DEBUG_STATUS_BREAK; - } + try { + + python::object resObj = it->second(Id); + + if (resObj.is_none()) + return DEBUG_STATUS_NO_CHANGE; + + python::extract getRetCode( resObj ); + if (getRetCode.check()) + return getRetCode(); + } + catch (const python::error_already_set &) { + // TODO: some logging, alerting... + return DEBUG_STATUS_BREAK; } - - if (resObj.is_none()) - return DEBUG_STATUS_NO_CHANGE; - // TODO: python code return invalid value // some logging, alerting... return DEBUG_STATUS_BREAK; diff --git a/test/scripts/typedvar.py b/test/scripts/typedvar.py index 23f7644..ee29ebd 100644 --- a/test/scripts/typedvar.py +++ b/test/scripts/typedvar.py @@ -103,6 +103,8 @@ class TypedVarTest( unittest.TestCase ): def testBitField(self): tv = target.module.typedVar("g_structWithBits") self.assertEqual( 4, tv.m_bit0_4 ) + self.assertEqual( 1, tv.m_bit5 ) + self.assertEqual( 3, tv.m_bit6_7 ) def testTypedVarList(self): tvl = target.module.typedVarList( target.module.g_listHead, "listStruct", "listEntry" )