void SQDbgServer::Break(HSQUIRRELVM v, SQInteger line, const SQChar *src, const SQChar *type, const SQChar *error) { _line = line; _src = src; _break_type = src; if (!error) { BeginDocument(); BeginElement(_SC("break")); Attribute(_SC("thread"), PtrToString(v)); Attribute(_SC("line"), IntToString(line)); Attribute(_SC("src"), src); Attribute(_SC("type"), type); SerializeState(v); EndElement(_SC("break")); EndDocument(); } else { BeginDocument(); BeginElement(_SC("break")); Attribute(_SC("thread"), PtrToString(v)); Attribute(_SC("line"), IntToString(line)); Attribute(_SC("src"), src); Attribute(_SC("type"), type); Attribute(_SC("error"), error); SerializeState(v); EndElement(_SC("break")); EndDocument(); } }
//COMMANDS void SQDbgServer::AddBreakpoint(BreakPoint &bp) { _breakpoints.insert(bp); BeginDocument(); BeginElement(_SC("addbreakpoint")); Attribute(_SC("line"),IntToString(bp._line)); Attribute(_SC("src"),bp._src.c_str()); EndElement(_SC("addbreakpoint")); EndDocument(); }
void SQDbgServer::RemoveBreakpoint(BreakPoint &bp) { BreakPointSetItor itor=_breakpoints.find(bp); if(itor==_breakpoints.end()){ BeginDocument(); BeginElement(_SC("break")); Attribute(_SC("desc"),_SC("the breakpoint doesn't exists")); EndElement(_SC("break")); EndDocument(); } else{ BeginDocument(); BeginElement(_SC("removebreakpoint")); Attribute(_SC("line"),IntToString(bp._line)); Attribute(_SC("src"),bp._src.c_str()); EndElement(_SC("removebreakpoint")); EndDocument(); _breakpoints.erase(itor); } }
void SQDbgServer::Break(int line,const SQChar *src,const SQChar *type,const SQChar *error) { if(!error){ BeginDocument(); BeginElement(_SC("break")); Attribute(_SC("line"),IntToString(line)); Attribute(_SC("src"),src); Attribute(_SC("type"),type); SerializeState(); EndElement(_SC("break")); EndDocument(); }else{ BeginDocument(); BeginElement(_SC("break")); Attribute(_SC("line"),IntToString(line)); Attribute(_SC("src"),src); Attribute(_SC("type"),type); Attribute(_SC("error"),error); SerializeState(); EndElement(_SC("break")); EndDocument(); } }
void SQDbgServer::RemoveWatch(int id) { WatchSetItor itor=_watches.find(Watch(id,_SC(""))); if(itor==_watches.end()){ BeginDocument(); BeginElement(_SC("error")); Attribute(_SC("desc"),_SC("the watch does not exists")); EndElement(_SC("error")); EndDocument(); } else{ _watches.erase(itor); scprintf(_SC("removed watch %d\n"),id); } }
//ab Add Breakpoint //rb Remove Breakpoint //sp Suspend void SQDbgServer::ParseMsg(const char *msg) { switch(*((unsigned short *)msg)){ case MSG_ID('a','b'): { BreakPoint bp; if(ParseBreakpoint(msg+3,bp)){ AddBreakpoint(bp); scprintf(_SC("added bp %d %s\n"),bp._line,bp._src.c_str()); } else scprintf(_SC("error parsing add breakpoint")); } break; case MSG_ID('r','b'): { BreakPoint bp; if(ParseBreakpoint(msg+3,bp)){ RemoveBreakpoint(bp); scprintf(_SC("removed bp %d %s\n"),bp._line,bp._src.c_str()); }else scprintf(_SC("error parsing remove breakpoint")); } break; case MSG_ID('g','o'): if(_state!=eDBG_Running){ _state=eDBG_Running; BeginDocument(); BeginElement(_SC("resumed")); EndElement(_SC("resumed")); EndDocument(); // Send(_SC("<resumed/>\r\n")); scprintf(_SC("go (execution resumed)\n")); } break; case MSG_ID('s','p'): if(_state!=eDBG_Suspended){ _state=eDBG_Suspended; scprintf(_SC("suspend\n")); } break; case MSG_ID('s','o'): if(_state==eDBG_Suspended){ _state=eDBG_StepOver; } break; case MSG_ID('s','i'): if(_state==eDBG_Suspended){ _state=eDBG_StepInto; scprintf(_SC("step into\n")); } break; case MSG_ID('s','r'): if(_state==eDBG_Suspended){ _state=eDBG_StepReturn; scprintf(_SC("step return\n")); } break; case MSG_ID('d','i'): if(_state!=eDBG_Disabled){ _state=eDBG_Disabled; scprintf(_SC("disabled\n")); } break; case MSG_ID('a','w'): { Watch w; if(ParseWatch(msg+3,w)) { AddWatch(w); scprintf(_SC("added watch %d %s\n"),w._id,w._exp.c_str()); } else scprintf(_SC("error parsing add watch")); } break; case MSG_ID('r','w'): { int id; if(ParseRemoveWatch(msg+3,id)) { RemoveWatch(id); scprintf(_SC("added watch %d\n"),id); } else scprintf(_SC("error parsing remove watch")); } break; case MSG_ID('t','r'): scprintf(_SC("terminate from user\n")); break; case MSG_ID('r','d'): scprintf(_SC("ready\n")); _ready=true; break; default: scprintf(_SC("unknown packet")); } }