2012-01-24 06:00:00 +08:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// User-customizing debug event handler
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2011-10-12 15:12:32 +08:00
|
|
|
#include "stdafx.h"
|
|
|
|
#include "dbgevent.h"
|
2011-10-14 15:03:51 +08:00
|
|
|
#include "dbgclient.h"
|
|
|
|
|
2012-01-24 06:00:00 +08:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
std::wstring fetchPythonExceptionStrings( python::object &tracebackModule );
|
2011-10-14 15:03:51 +08:00
|
|
|
|
|
|
|
namespace pykd {
|
2011-10-12 15:12:32 +08:00
|
|
|
|
2012-01-24 06:00:00 +08:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2011-10-12 15:12:32 +08:00
|
|
|
|
2011-10-14 15:03:51 +08:00
|
|
|
EventHandler::EventHandler()
|
2011-10-12 15:12:32 +08:00
|
|
|
{
|
|
|
|
HRESULT hres;
|
|
|
|
|
2011-10-26 14:49:57 +08:00
|
|
|
hres = g_dbgClient->client()->CreateClient( &m_handlerClient );
|
2011-10-12 15:12:32 +08:00
|
|
|
if ( FAILED( hres ) )
|
|
|
|
throw DbgException( "IDebugClient::CreateClient" );
|
|
|
|
|
2011-10-26 14:49:57 +08:00
|
|
|
hres = m_handlerClient->SetEventCallbacks(this);
|
2011-10-12 15:12:32 +08:00
|
|
|
if (FAILED(hres))
|
2011-10-26 14:49:57 +08:00
|
|
|
throw DbgException( "IDebugClient::SetEventCallbacks" );
|
|
|
|
|
|
|
|
m_parentClient = g_dbgClient;
|
2011-10-12 15:12:32 +08:00
|
|
|
}
|
|
|
|
|
2012-01-24 06:00:00 +08:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2011-10-12 15:12:32 +08:00
|
|
|
|
2011-10-26 14:49:57 +08:00
|
|
|
EventHandler::EventHandler( DebugClientPtr &client )
|
2011-10-12 15:12:32 +08:00
|
|
|
{
|
2011-10-14 15:03:51 +08:00
|
|
|
HRESULT hres;
|
2011-10-12 15:12:32 +08:00
|
|
|
|
2011-10-26 14:49:57 +08:00
|
|
|
hres = client->client()->CreateClient( &m_handlerClient );
|
2011-10-14 15:03:51 +08:00
|
|
|
if ( FAILED( hres ) )
|
|
|
|
throw DbgException( "IDebugClient::CreateClient" );
|
|
|
|
|
2011-10-26 14:49:57 +08:00
|
|
|
hres = m_handlerClient->SetEventCallbacks(this);
|
2011-10-14 15:03:51 +08:00
|
|
|
if (FAILED(hres))
|
2011-10-26 14:49:57 +08:00
|
|
|
throw DbgException( "IDebugClient::SetEventCallbacks" );
|
|
|
|
|
|
|
|
m_parentClient = client;
|
2011-10-12 15:12:32 +08:00
|
|
|
}
|
|
|
|
|
2012-01-24 06:00:00 +08:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2011-10-12 15:12:32 +08:00
|
|
|
|
2011-10-14 15:03:51 +08:00
|
|
|
EventHandler::~EventHandler()
|
2011-10-12 15:12:32 +08:00
|
|
|
{
|
2011-10-26 14:49:57 +08:00
|
|
|
}
|
|
|
|
|
2012-01-24 06:00:00 +08:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2011-10-26 14:49:57 +08:00
|
|
|
|
|
|
|
HRESULT EventHandler::GetInterestMask(
|
|
|
|
__out PULONG Mask
|
|
|
|
)
|
|
|
|
{
|
|
|
|
*Mask = 0;
|
|
|
|
|
|
|
|
*Mask |= DEBUG_EVENT_LOAD_MODULE;
|
|
|
|
*Mask |= DEBUG_EVENT_UNLOAD_MODULE;
|
|
|
|
*Mask |= DEBUG_EVENT_SESSION_STATUS;
|
|
|
|
*Mask |= DEBUG_EVENT_EXCEPTION;
|
|
|
|
*Mask |= DEBUG_EVENT_BREAKPOINT;
|
|
|
|
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
2012-01-24 06:00:00 +08:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2011-10-26 14:49:57 +08:00
|
|
|
|
|
|
|
HRESULT EventHandler::Breakpoint(
|
|
|
|
__in PDEBUG_BREAKPOINT Bp
|
|
|
|
)
|
|
|
|
{
|
2012-01-24 06:00:00 +08:00
|
|
|
ULONG Id;
|
|
|
|
HRESULT hres = Bp->GetId(&Id);
|
|
|
|
if (S_OK == hres)
|
|
|
|
{
|
|
|
|
PyThread_StateSave pyThreadSave( m_parentClient->getThreadState() );
|
|
|
|
return onBreakpoint(Id);
|
|
|
|
}
|
|
|
|
|
|
|
|
return DEBUG_STATUS_NO_CHANGE;
|
2011-10-26 14:49:57 +08:00
|
|
|
}
|
|
|
|
|
2012-01-24 06:00:00 +08:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2011-10-26 14:49:57 +08:00
|
|
|
|
|
|
|
HRESULT EventHandler::Exception(
|
|
|
|
__in PEXCEPTION_RECORD64 Exception,
|
|
|
|
__in ULONG FirstChance
|
|
|
|
)
|
|
|
|
{
|
|
|
|
python::list exceptParams;
|
|
|
|
python::dict exceptData;
|
|
|
|
|
|
|
|
// build list of parameters
|
|
|
|
for (ULONG i = 0; i < Exception->NumberParameters; ++i)
|
2012-01-24 06:00:00 +08:00
|
|
|
exceptParams.append( Exception->ExceptionInformation[i] );
|
2011-10-26 14:49:57 +08:00
|
|
|
|
|
|
|
exceptData["Code"] = Exception->ExceptionCode;
|
|
|
|
exceptData["Flags"] = Exception->ExceptionFlags;
|
|
|
|
exceptData["Record"] = Exception->ExceptionRecord;
|
|
|
|
exceptData["Address"] = Exception->ExceptionAddress;
|
|
|
|
exceptData["Parameters"] = exceptParams;
|
|
|
|
exceptData["FirstChance"] = (0 != FirstChance);
|
|
|
|
|
|
|
|
PyThread_StateSave pyThreadSave( m_parentClient->getThreadState() );
|
|
|
|
|
|
|
|
return onException(exceptData);
|
|
|
|
}
|
|
|
|
|
2012-01-24 06:00:00 +08:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2011-10-26 14:49:57 +08:00
|
|
|
|
|
|
|
HRESULT EventHandler::LoadModule(
|
|
|
|
__in ULONG64 ImageFileHandle,
|
|
|
|
__in ULONG64 BaseOffset,
|
|
|
|
__in ULONG ModuleSize,
|
|
|
|
__in PCSTR ModuleName,
|
|
|
|
__in PCSTR ImageName,
|
|
|
|
__in ULONG CheckSum,
|
|
|
|
__in ULONG TimeDateStamp
|
|
|
|
)
|
|
|
|
{
|
2011-12-06 17:26:58 +08:00
|
|
|
PyThread_StateSave pyThreadSave( m_parentClient->getThreadState() );
|
|
|
|
return onLoadModule( m_parentClient->loadModuleByOffset(BaseOffset) );
|
2011-10-26 14:49:57 +08:00
|
|
|
}
|
|
|
|
|
2012-01-24 06:00:00 +08:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2011-10-26 14:49:57 +08:00
|
|
|
|
|
|
|
HRESULT EventHandler::UnloadModule(
|
|
|
|
__in PCSTR ImageBaseName,
|
|
|
|
__in ULONG64 BaseOffset
|
|
|
|
)
|
|
|
|
{
|
2011-12-06 17:26:58 +08:00
|
|
|
PyThread_StateSave pyThreadSave( m_parentClient->getThreadState() );
|
|
|
|
BaseOffset = m_parentClient->addr64(BaseOffset);
|
|
|
|
return onUnloadModule( BaseOffset );
|
2011-10-26 14:49:57 +08:00
|
|
|
}
|
|
|
|
|
2012-01-24 06:00:00 +08:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2011-10-26 14:49:57 +08:00
|
|
|
|
|
|
|
HRESULT EventHandler::SessionStatus(
|
|
|
|
__in ULONG Status
|
|
|
|
)
|
|
|
|
{
|
|
|
|
//PyThread_StateSave pyThreadSave;
|
|
|
|
//return onChangeSessionStatus( Status );
|
|
|
|
|
|
|
|
return S_OK;
|
2011-10-12 15:12:32 +08:00
|
|
|
}
|
|
|
|
|
2012-01-24 06:00:00 +08:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2011-10-12 15:12:32 +08:00
|
|
|
|
2011-10-26 14:49:57 +08:00
|
|
|
HRESULT EventHandler::ChangeDebuggeeState(
|
|
|
|
__in ULONG Flags,
|
|
|
|
__in ULONG64 Argument
|
|
|
|
)
|
|
|
|
{
|
|
|
|
//PyThread_StateSave pyThreadSave;
|
|
|
|
//return onChangeDebugeeState();
|
|
|
|
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
2012-01-24 06:00:00 +08:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2011-10-12 15:12:32 +08:00
|
|
|
|
2012-01-24 06:00:00 +08:00
|
|
|
void EventHandlerWrap::onHandlerException()
|
|
|
|
{
|
|
|
|
// TODO: some logging, alerting....
|
|
|
|
}
|
2011-10-26 14:49:57 +08:00
|
|
|
|
2012-01-24 06:00:00 +08:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
2011-10-26 14:49:57 +08:00
|
|
|
|
|
|
|
|
2012-01-24 06:00:00 +08:00
|
|
|
}; // end pykd namespace
|