[0.3.x] fixed : AV exception from dbgCommand

git-svn-id: https://pykd.svn.codeplex.com/svn@84516 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
SND\kernelnet_cp 2013-07-31 15:08:20 +00:00 committed by Mikhail I. Izmestev
parent cb1df7cd3b
commit c73351207a

View File

@ -7,18 +7,35 @@
namespace pykd { namespace pykd {
class AutoRestorePyState
{
public:
AutoRestorePyState()
{
m_state = PyEval_SaveThread();
}
~AutoRestorePyState()
{
PyEval_RestoreThread( m_state );
}
private:
PyThreadState* m_state;
};
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
kdlib::ExecutionStatus targetGo() kdlib::ExecutionStatus targetGo()
{ {
kdlib::ExecutionStatus status; kdlib::ExecutionStatus status;
PyThreadState* state = PyEval_SaveThread(); AutoRestorePyState pystate;
status = kdlib::targetGo(); status = kdlib::targetGo();
PyEval_RestoreThread( state );
return status; return status;
} }
@ -26,11 +43,9 @@ kdlib::ExecutionStatus targetGo()
void targetBreak() void targetBreak()
{ {
PyThreadState* state = PyEval_SaveThread(); AutoRestorePyState pystate;
kdlib::targetBreak(); kdlib::targetBreak();
PyEval_RestoreThread( state );
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -39,12 +54,10 @@ kdlib::ExecutionStatus targetStep()
{ {
kdlib::ExecutionStatus status; kdlib::ExecutionStatus status;
PyThreadState* state = PyEval_SaveThread(); AutoRestorePyState pystate;
status = kdlib::targetStep(); status = kdlib::targetStep();
PyEval_RestoreThread( state );
return status; return status;
} }
@ -54,12 +67,10 @@ kdlib::ExecutionStatus targetStepIn()
{ {
kdlib::ExecutionStatus status; kdlib::ExecutionStatus status;
PyThreadState* state = PyEval_SaveThread(); AutoRestorePyState pystate;
status = kdlib::targetStepIn(); status = kdlib::targetStepIn();
PyEval_RestoreThread( state );
return status; return status;
} }
@ -69,14 +80,11 @@ kdlib::PROCESS_DEBUG_ID startProcess( const std::wstring &processName )
{ {
kdlib::PROCESS_DEBUG_ID id; kdlib::PROCESS_DEBUG_ID id;
PyThreadState* state = PyEval_SaveThread(); AutoRestorePyState pystate;
id = kdlib::startProcess(processName); id = kdlib::startProcess(processName);
PyEval_RestoreThread( state );
return id; return id;
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -85,12 +93,10 @@ kdlib::PROCESS_DEBUG_ID attachProcess( kdlib::PROCESS_ID pid )
{ {
kdlib::PROCESS_DEBUG_ID id; kdlib::PROCESS_DEBUG_ID id;
PyThreadState* state = PyEval_SaveThread(); AutoRestorePyState pystate;
id = kdlib::attachProcess(pid); id = kdlib::attachProcess(pid);
PyEval_RestoreThread( state );
return id; return id;
} }
@ -98,23 +104,19 @@ kdlib::PROCESS_DEBUG_ID attachProcess( kdlib::PROCESS_ID pid )
void loadDump( const std::wstring &fileName ) void loadDump( const std::wstring &fileName )
{ {
PyThreadState* state = PyEval_SaveThread(); AutoRestorePyState pystate;
kdlib::loadDump(fileName); kdlib::loadDump(fileName);
PyEval_RestoreThread( state );
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
std::wstring debugCommand( const std::wstring &command ) std::wstring debugCommand( const std::wstring &command )
{ {
PyThreadState* state = PyEval_SaveThread(); AutoRestorePyState pystate;
std::wstring outstr = kdlib::debugCommand(command); std::wstring outstr = kdlib::debugCommand(command);
PyEval_RestoreThread( state );
return outstr; return outstr;
} }
@ -122,12 +124,10 @@ std::wstring debugCommand( const std::wstring &command )
unsigned long long evaluate( const std::wstring &expression ) unsigned long long evaluate( const std::wstring &expression )
{ {
PyThreadState* state = PyEval_SaveThread(); AutoRestorePyState pystate;
unsigned long long result = kdlib::evaluate(expression); unsigned long long result = kdlib::evaluate(expression);
PyEval_RestoreThread( state );
return result; return result;
} }