implemented debugger

--HG--
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40251
This commit is contained in:
David Anderson 2007-01-01 03:40:29 +00:00
parent 9ad824fe7a
commit f8c88a75df
3 changed files with 42 additions and 26 deletions

View File

@ -767,7 +767,8 @@ int BaseContext::LookupLine(ucell_t addr, uint32_t *line)
return SP_ERROR_NOT_FOUND; return SP_ERROR_NOT_FOUND;
} }
*line = ctx->lines[low].line; /* Since the CIP occurs BEFORE the line, we have to add one */
*line = ctx->lines[low].line + 1;
return SP_ERROR_NONE; return SP_ERROR_NONE;
} }

View File

@ -63,7 +63,7 @@ SourcePawnEngine::~SourcePawnEngine()
while (m_FreedCalls) while (m_FreedCalls)
{ {
pTemp = m_FreedCalls->next; pTemp = m_FreedCalls->next;
delete pTemp; delete m_FreedCalls;
m_FreedCalls = pTemp; m_FreedCalls = pTemp;
} }
} }
@ -386,15 +386,10 @@ TracedCall *SourcePawnEngine::MakeTracedCall(bool new_chain)
/* Unlink the head node from the free list */ /* Unlink the head node from the free list */
pCall = m_FreedCalls; pCall = m_FreedCalls;
m_FreedCalls = m_FreedCalls->next; m_FreedCalls = m_FreedCalls->next;
if (m_FreedCalls)
{
m_FreedCalls->prev = NULL;
}
} }
/* Link as the head node into the call stack */ /* Link as the head node into the call stack */
pCall->next = m_CallStack; pCall->next = m_CallStack;
pCall->prev = NULL;
if (new_chain) if (new_chain)
{ {
@ -403,10 +398,6 @@ TracedCall *SourcePawnEngine::MakeTracedCall(bool new_chain)
pCall->chain = m_CurChain; pCall->chain = m_CurChain;
} }
if (m_CallStack)
{
m_CallStack->prev = pCall;
}
m_CallStack = pCall; m_CallStack = pCall;
return pCall; return pCall;
@ -418,10 +409,6 @@ void SourcePawnEngine::FreeTracedCall(TracedCall *pCall)
if (pCall == m_CallStack) if (pCall == m_CallStack)
{ {
m_CallStack = m_CallStack->next; m_CallStack = m_CallStack->next;
if (m_CallStack)
{
m_CallStack->prev = NULL;
}
} }
/* Add this to our linked list of freed calls */ /* Add this to our linked list of freed calls */
@ -429,11 +416,8 @@ void SourcePawnEngine::FreeTracedCall(TracedCall *pCall)
{ {
m_FreedCalls = pCall; m_FreedCalls = pCall;
m_FreedCalls->next = NULL; m_FreedCalls->next = NULL;
m_FreedCalls->prev = NULL;
} else { } else {
pCall->next = m_FreedCalls; pCall->next = m_FreedCalls;
pCall->prev = NULL;
m_FreedCalls->prev = pCall;
m_FreedCalls = pCall; m_FreedCalls = pCall;
} }
} }
@ -465,6 +449,7 @@ void SourcePawnEngine::RunTracer(sp_context_t *ctx, uint32_t frame, uint32_t cod
* so we have to push a new call onto our list. * so we have to push a new call onto our list.
*/ */
TracedCall *pCall = MakeTracedCall(false); TracedCall *pCall = MakeTracedCall(false);
pCall->ctx = ctx;
pCall->frm = frame; pCall->frm = frame;
} else if (m_CallStack->frm < frame) { } else if (m_CallStack->frm < frame) {
/* The last frame has moved up the stack, /* The last frame has moved up the stack,
@ -483,7 +468,14 @@ void SourcePawnEngine::PopTracer(int error, const char *msg)
if (error != SP_ERROR_NONE && m_pDebugHook) if (error != SP_ERROR_NONE && m_pDebugHook)
{ {
CContextTrace trace(m_CallStack, error, msg); uint32_t native = INVALID_CIP;
if (m_CallStack->ctx->n_err)
{
native = m_CallStack->ctx->n_idx;
}
CContextTrace trace(m_CallStack, error, msg, native);
m_pDebugHook->OnContextExecuteError(m_CallStack->ctx->context, &trace); m_pDebugHook->OnContextExecuteError(m_CallStack->ctx->context, &trace);
} }
@ -496,8 +488,8 @@ void SourcePawnEngine::PopTracer(int error, const char *msg)
m_CurChain--; m_CurChain--;
} }
CContextTrace::CContextTrace(TracedCall *pStart, int error, const char *msg) : CContextTrace::CContextTrace(TracedCall *pStart, int error, const char *msg, uint32_t native) :
m_Error(error), m_pMsg(msg), m_pStart(pStart), m_pIterator(pStart) m_Error(error), m_pMsg(msg), m_pStart(pStart), m_pIterator(pStart), m_Native(native)
{ {
} }
@ -534,7 +526,7 @@ void CContextTrace::ResetTrace()
bool CContextTrace::GetTraceInfo(CallStackInfo *trace) bool CContextTrace::GetTraceInfo(CallStackInfo *trace)
{ {
if (m_pIterator->chain != m_pStart->chain) if (!m_pIterator || (m_pIterator->chain != m_pStart->chain))
{ {
return false; return false;
} }
@ -547,8 +539,6 @@ bool CContextTrace::GetTraceInfo(CallStackInfo *trace)
IPluginContext *pContext = m_pIterator->ctx->context; IPluginContext *pContext = m_pIterator->ctx->context;
IPluginDebugInfo *pInfo = pContext->GetDebugInfo(); IPluginDebugInfo *pInfo = pContext->GetDebugInfo();
m_pIterator = m_pIterator->next;
if (!pInfo) if (!pInfo)
{ {
return false; return false;
@ -556,6 +546,7 @@ bool CContextTrace::GetTraceInfo(CallStackInfo *trace)
if (!trace) if (!trace)
{ {
m_pIterator = m_pIterator->next;
return true; return true;
} }
@ -574,5 +565,28 @@ bool CContextTrace::GetTraceInfo(CallStackInfo *trace)
trace->line = 0; trace->line = 0;
} }
m_pIterator = m_pIterator->next;
return true; return true;
} }
const char *CContextTrace::GetLastNative(uint32_t *index)
{
if (m_Native == INVALID_CIP)
{
return NULL;
}
sp_native_t *native;
if (m_pIterator->ctx->context->GetNativeByIndex(m_Native, &native) != SP_ERROR_NONE)
{
return NULL;
}
if (index)
{
*index = m_Native;
}
return native->name;
}

View File

@ -11,7 +11,6 @@ namespace SourcePawn
uint32_t frm; uint32_t frm;
sp_context_t *ctx; sp_context_t *ctx;
TracedCall *next; TracedCall *next;
TracedCall *prev;
unsigned int chain; unsigned int chain;
}; };
@ -19,7 +18,7 @@ namespace SourcePawn
class CContextTrace : public IContextTrace class CContextTrace : public IContextTrace
{ {
public: public:
CContextTrace(TracedCall *pStart, int error, const char *msg); CContextTrace(TracedCall *pStart, int error, const char *msg, uint32_t native);
public: public:
virtual int GetErrorCode(); virtual int GetErrorCode();
virtual const char *GetErrorString(); virtual const char *GetErrorString();
@ -27,11 +26,13 @@ namespace SourcePawn
virtual const char *GetCustomErrorString(); virtual const char *GetCustomErrorString();
virtual bool GetTraceInfo(CallStackInfo *trace); virtual bool GetTraceInfo(CallStackInfo *trace);
virtual void ResetTrace(); virtual void ResetTrace();
virtual const char *GetLastNative(uint32_t *index);
private: private:
TracedCall *m_pStart; TracedCall *m_pStart;
TracedCall *m_pIterator; TracedCall *m_pIterator;
const char *m_pMsg; const char *m_pMsg;
int m_Error; int m_Error;
uint32_t m_Native;
}; };