From 86e8383463597fe95c308121433f093778646f6b Mon Sep 17 00:00:00 2001 From: ussrhero Date: Wed, 20 Feb 2019 00:48:41 +0300 Subject: [PATCH] added : getOutputMask added : setOutputMask added : test for eventHanlder.onDebugOutput: --- kdlibcpp | 2 +- pykd/pydbgeng.h | 14 +++++++++++++ pykd/pyeventhandler.h | 2 +- pykd/pykdver.h | 2 +- pykd/pymod.cpp | 20 ++++++++++++++++++- setup/buildall.cmd | 4 +++- test/scripts/eventtest.py | 41 ++++++++++++++++++++++++++------------- test/scripts/pykdtest.py | 4 +++- 8 files changed, 69 insertions(+), 20 deletions(-) diff --git a/kdlibcpp b/kdlibcpp index a281002..e1708cd 160000 --- a/kdlibcpp +++ b/kdlibcpp @@ -1 +1 @@ -Subproject commit a281002c91a1d756075849b1144b4e5e81c2fe45 +Subproject commit e1708cdb932856042b13763daae3dfbf6ed5c87d diff --git a/pykd/pydbgeng.h b/pykd/pydbgeng.h index b296d9c..3e37472 100644 --- a/pykd/pydbgeng.h +++ b/pykd/pydbgeng.h @@ -133,6 +133,20 @@ void changeDebugOptions(kdlib::DebugOptionsSet &addOptions, kdlib::DebugOptionsS kdlib::changeDebugOptions(addOptions, removeOptions); } +inline +kdlib::OutputFlagsSet getOutputMask() +{ + AutoRestorePyState pystate; + return kdlib::getOutputFlags(); +} + +inline +void setOutputMask(const kdlib::OutputFlagsSet& outputMask) +{ + AutoRestorePyState pystate; + kdlib::setOutputFlags(outputMask); +} + /////////////////////////////////////////////////////////////////////////////// // processes end threads diff --git a/pykd/pyeventhandler.h b/pykd/pyeventhandler.h index 372e746..bdad1a0 100644 --- a/pykd/pyeventhandler.h +++ b/pykd/pyeventhandler.h @@ -40,7 +40,7 @@ public: void onChangeLocalScope() override; void onChangeSymbolPaths() override; void onChangeBreakpoints() override; - void onDebugOutput(const std::wstring& text, kdlib::OutputFlag) override; + void onDebugOutput(const std::wstring& text, kdlib::OutputFlag flag) override; void onStartInput() override; void onStopInput() override; diff --git a/pykd/pykdver.h b/pykd/pykdver.h index 5f69344..c45bc4d 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 4 -#define PYKD_VERSION_BUILDNO 4 +#define PYKD_VERSION_BUILDNO 5 #define __VER_STR2__(x) #x #define __VER_STR1__(x) __VER_STR2__(x) diff --git a/pykd/pymod.cpp b/pykd/pymod.cpp index 3722140..09e54cc 100644 --- a/pykd/pymod.cpp +++ b/pykd/pymod.cpp @@ -194,7 +194,10 @@ void pykd_init() "Return debug options" ); python::def( "changeDebugOptions", pykd::changeDebugOptions, "Change debug options" ); - + python::def("getOutputMask", pykd::getOutputMask, + "Get output mask"); + python::def("setOutputMask", pykd::setOutputMask, + "Set output mask"); python::def( "breakin", pykd::targetBreak, "Break into debugger" ); @@ -1437,6 +1440,21 @@ void pykd_init() .value("Execute", kdlib::Execute) ; + python::enum_("outputFlag", "Set of output mask") + .value("Normal", kdlib::Normal) + .value("Error", kdlib::Error) + .value("Warning", kdlib::Warning) + .value("Verbose", kdlib::Verbose) + .value("Prompt", kdlib::Prompt) + .value("PromptRegister", kdlib::PromptRegister) + .value("ExtensionWarning", kdlib::ExtensionWarning) + .value("Debuggee", kdlib::Debuggee) + .value("DebuggeePrompt", kdlib::DebuggeePrompt) + .value("Symbols", kdlib::Symbols) + .value("Status", kdlib::Status) + .value("All", kdlib::All) + ; + // C++ exception translation to python pykd::registerExceptions(); } diff --git a/setup/buildall.cmd b/setup/buildall.cmd index efd8806..a42544f 100644 --- a/setup/buildall.cmd +++ b/setup/buildall.cmd @@ -16,4 +16,6 @@ py -3.6 setup.py bdist_wheel --plat-name=win-amd64 --python-tag=cp36 py -3.7 setup.py bdist_zip --plat-name=win32 py -3.7 setup.py bdist_zip --plat-name=win-amd64 py -3.7 setup.py bdist_wheel --plat-name=win32 --python-tag=cp37 -py -3.7 setup.py bdist_wheel --plat-name=win-amd64 --python-tag=cp37 \ No newline at end of file +py -3.7 setup.py bdist_wheel --plat-name=win-amd64 --python-tag=cp37 + +py setup.py bdist_pdb \ No newline at end of file diff --git a/test/scripts/eventtest.py b/test/scripts/eventtest.py index 5c179dc..08c8ec5 100644 --- a/test/scripts/eventtest.py +++ b/test/scripts/eventtest.py @@ -3,23 +3,36 @@ import unittest import target import pykd -class handler( pykd.eventHandler ): +class OutHandler( pykd.eventHandler ): def __init__(self): pykd.eventHandler.__init__(self) - self.counter=0 - - def onException(self, param): - self.counter += 1 - return pykd.DEBUG_STATUS_NO_CHANGE + self.out_counter=0 + self.verbose_counter = 0 - def onExecutionStatusChange(self,status): - print status + def onDebugOutput(self, text, mask): + if mask == pykd.outputFlag.Normal: + self.out_counter += 1 + elif mask == pykd.outputFlag.Verbose: + self.verbose_counter += 1 -class EventTest( unittest.TestCase ): +class OutputHandlerTest( unittest.TestCase ): - def testDebugBreak( self ): - h = handler() - pykd.go() - pykd.go() - self.assertEqual( 2, h.counter ) + def setUp(self): + self.oldMask = pykd.getOutputMask() + self.handler = OutHandler() + + def tearDown(self): + pykd.killAllProcesses() + pykd.setOutputMask(self.oldMask) + + def testDebugOutput(self): + pykd.startProcess( target.appPath ) + self.assertTrue( 0 < self.handler.out_counter) + self.assertFalse( 0 < self.handler.verbose_counter) + + def testDebugOutputMask(self): + pykd.setOutputMask(pykd.outputFlag.Normal | pykd.outputFlag.Verbose) + pykd.startProcess( target.appPath ) + self.assertTrue( 0 < self.handler.out_counter) + self.assertTrue( 0 < self.handler.verbose_counter) \ No newline at end of file diff --git a/test/scripts/pykdtest.py b/test/scripts/pykdtest.py index 2ed3b67..f3b9109 100644 --- a/test/scripts/pykdtest.py +++ b/test/scripts/pykdtest.py @@ -30,6 +30,7 @@ import synsymtest import taggedtest import arm64dumptest import armdumptest +import eventtest pykd.initialize() @@ -71,7 +72,8 @@ def getTestSuite( singleName = "" ): unittest.TestLoader().loadTestsFromTestCase( taggedtest.TaggedTest ), unittest.TestLoader().loadTestsFromTestCase( arm64dumptest.ARM64DumpTest ), unittest.TestLoader().loadTestsFromTestCase( armdumptest.ARMDumpTest ), - + unittest.TestLoader().loadTestsFromTestCase( eventtest.OutputHandlerTest ), + #unittest.TestLoader().loadTestsFromTestCase( excepttest.ExceptionTest ), ] ) else: