[0.3.x] added : onException event handler

git-svn-id: https://pykd.svn.codeplex.com/svn@84645 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
SND\kernelnet_cp 2013-08-11 15:27:13 +00:00 committed by Mikhail I. Izmestev
parent 3eb38e0cca
commit ead4054ccc
5 changed files with 106 additions and 18 deletions

View File

@ -177,4 +177,36 @@ std::wstring printSystemVersion( kdlib::SystemInfo& sysInfo )
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
python::list getExceptionInfoParameters( kdlib::ExceptionInfo& exceptionInfo )
{
python::list lst;
for ( unsigned long i = 0; i < exceptionInfo.parameterCount; ++i )
lst.append( exceptionInfo.parameters[i] );
return lst;
}
///////////////////////////////////////////////////////////////////////////////
std::wstring printExceptionInfo( kdlib::ExceptionInfo& exceptionInfo )
{
std::wstringstream sstream;
sstream << L"FirstChance= " << (exceptionInfo.firstChance ? "True" : "False") << std::endl;
sstream << L"ExceptionCode= 0x" << std::hex << exceptionInfo.exceptionCode << std::endl;
sstream << L"ExceptionFlags= 0x" << std::hex << exceptionInfo.exceptionFlags << std::endl;
sstream << L"ExceptionRecord= 0x" << std::hex << exceptionInfo.exceptionRecord << std::endl;
sstream << L"ExceptionAddress= 0x" << std::hex << exceptionInfo.exceptionAddress << std::endl;
for (ULONG i = 0; i < exceptionInfo.parameterCount; ++i)
{
sstream << L"Param[" << std::dec << i << L"]= 0x";
sstream << std::hex << exceptionInfo.parameters[i] << std::endl;
}
return sstream.str();
}
///////////////////////////////////////////////////////////////////////////////
} //end namespace pykd } //end namespace pykd

View File

@ -29,6 +29,10 @@ kdlib::SystemInfo getSystemVersion();
std::wstring printSystemVersion( kdlib::SystemInfo& sysInfo ); std::wstring printSystemVersion( kdlib::SystemInfo& sysInfo );
python::list getExceptionInfoParameters( kdlib::ExceptionInfo& exceptionInfo );
std::wstring printExceptionInfo( kdlib::ExceptionInfo& exceptionInfo );
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
} //end namespace pykd } //end namespace pykd

View File

@ -198,4 +198,56 @@ void EventHandler::onExecutionStatusChange( kdlib::ExecutionStatus executionStat
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
kdlib::DebugCallbackResult EventHandler::onException( const kdlib::ExceptionInfo &exceptionInfo )
{
kdlib::DebugCallbackResult result = kdlib::DebugCallbackNoChange;
PyEval_RestoreThread( m_pystate );
try {
do {
python::override pythonHandler = get_override( "onException" );
if ( !pythonHandler )
{
result = kdlib::EventHandler::onException( exceptionInfo );
break;
}
python::object resObj = pythonHandler( exceptionInfo );
if ( resObj.is_none() )
{
result = kdlib::DebugCallbackNoChange;
break;
}
int retVal = python::extract<int>( resObj );
if ( retVal >= kdlib::DebugCallbackMax )
{
result = kdlib::DebugCallbackBreak;
break;
}
result = kdlib::DebugCallbackResult(retVal);
} while( FALSE );
}
catch (const python::error_already_set &)
{
printException();
result = kdlib::DebugCallbackBreak;
}
m_pystate = PyEval_SaveThread();
return result;
}
///////////////////////////////////////////////////////////////////////////////
} // end namespace pykd } // end namespace pykd

View File

@ -44,6 +44,7 @@ public:
virtual kdlib::DebugCallbackResult onBreakpoint( kdlib::BREAKPOINT_ID bpId ); virtual kdlib::DebugCallbackResult onBreakpoint( kdlib::BREAKPOINT_ID bpId );
virtual void onExecutionStatusChange( kdlib::ExecutionStatus executionStatus ); virtual void onExecutionStatusChange( kdlib::ExecutionStatus executionStatus );
virtual kdlib::DebugCallbackResult onException( const kdlib::ExceptionInfo &exceptionInfo );
private: private:

View File

@ -574,7 +574,7 @@ BOOST_PYTHON_MODULE( pykd )
// .def("__getitem__", &ScopeVars::getVarByIndex ) // .def("__getitem__", &ScopeVars::getVarByIndex )
// .def("__getitem__", &ScopeVars::getVarByName ); // .def("__getitem__", &ScopeVars::getVarByName );
python::class_< kdlib::SystemInfo>( python::class_<kdlib::SystemInfo>(
"systemVersion", "Operation system version", python::no_init) "systemVersion", "Operation system version", python::no_init)
//.def_readonly( "platformId", &SystemVersion::platformId, //.def_readonly( "platformId", &SystemVersion::platformId,
// "Platform ID: VER_PLATFORM_WIN32_NT for NT-based Windows") // "Platform ID: VER_PLATFORM_WIN32_NT for NT-based Windows")
@ -594,23 +594,22 @@ BOOST_PYTHON_MODULE( pykd )
"Return object as a string"); "Return object as a string");
// python::class_< ExceptionInfo, ExceptionInfoPtr, boost::noncopyable >( python::class_<kdlib::ExceptionInfo>(
// "exceptionInfo", "Exception information", python::no_init ) "exceptionInfo", "Exception information", python::no_init )
// .def_readonly( "FirstChance", &ExceptionInfo::FirstChance, .def_readonly( "firstChance", &kdlib::ExceptionInfo::firstChance,
// "Specifies whether this exception has been previously encountered") "Specifies whether this exception has been previously encountered")
// .def_readonly( "ExceptionCode", &ExceptionInfo::ExceptionCode, .def_readonly( "exceptionCode", &kdlib::ExceptionInfo::exceptionCode,
// "The reason the exception occurred") "The reason the exception occurred")
// .def_readonly( "ExceptionFlags", &ExceptionInfo::ExceptionFlags, .def_readonly( "exceptionFlags", &kdlib::ExceptionInfo::exceptionFlags,
// "The exception flags") "The exception flags")
// .def_readonly( "ExceptionRecord", &ExceptionInfo::ExceptionRecord, .def_readonly( "exceptionRecord", &kdlib::ExceptionInfo::exceptionRecord,
// "A pointer to an associated EXCEPTION_RECORD structure") "A pointer to an associated EXCEPTION_RECORD structure")
// .def_readonly( "ExceptionAddress", &ExceptionInfo::ExceptionAddress, .def_readonly( "exceptionAddress", &kdlib::ExceptionInfo::exceptionAddress,
// "The address where the exception occurred") "The address where the exception occurred")
// .add_property( "Parameters", &ExceptionInfo::getParameters, .add_property( "parameters", &getExceptionInfoParameters,
// "An array of additional arguments that describe the exception") "An array of additional arguments that describe the exception")
// .def( "__str__", &ExceptionInfo::print, .def( "__str__", &printExceptionInfo,
// "Return object as a string"); "Return object as a string");
// python::enum_<EVENT_TYPE>("eventType", "Type of debug event") // python::enum_<EVENT_TYPE>("eventType", "Type of debug event")
// .value("Breakpoint", EventTypeBreakpoint) // .value("Breakpoint", EventTypeBreakpoint)