void CmdInterrupt::recvImpl(DebuggerThriftBuffer &thrift) { DebuggerCommand::recvImpl(thrift); thrift.read(m_interrupt); thrift.read(m_program); thrift.read(m_errorMsg); thrift.read(m_threadId); thrift.read(m_pendingJump); m_bpi = BreakPointInfoPtr(new BreakPointInfo()); bool site; thrift.read(site); if (site) { thrift.read(m_bpi->m_file); thrift.read(m_bpi->m_line1); thrift.read(m_bpi->m_char1); thrift.read(m_bpi->m_line2); thrift.read(m_bpi->m_char2); DFunctionInfoPtr func(new DFunctionInfo()); thrift.read(func->m_namespace); thrift.read(func->m_class); thrift.read(func->m_function); m_bpi->m_funcs.push_back(func); thrift.read(m_bpi->m_exceptionClass); thrift.read(m_bpi->m_exceptionObject); } BreakPointInfo::RecvImpl(m_matched, thrift); }
void CmdInterrupt::recvImpl(DebuggerThriftBuffer &thrift) { DebuggerCommand::recvImpl(thrift); thrift.read(m_interrupt); thrift.read(m_program); thrift.read(m_errorMsg); thrift.read(m_threadId); // Used to be m_pendingJump, but that's been removed. Read a dummy bool until // we rev the protocol. bool dummy; thrift.read(dummy); m_bpi = BreakPointInfoPtr(new BreakPointInfo()); bool site; thrift.read(site); if (site) { thrift.read(m_bpi->m_file); thrift.read(m_bpi->m_line1); thrift.read(m_bpi->m_char1); thrift.read(m_bpi->m_line2); thrift.read(m_bpi->m_char2); DFunctionInfoPtr func(new DFunctionInfo()); thrift.read(func->m_namespace); thrift.read(func->m_class); thrift.read(func->m_function); m_bpi->m_funcs.push_back(func); thrift.read(m_bpi->m_exceptionClass); thrift.read(m_bpi->m_exceptionObject); } BreakPointInfo::RecvImpl(m_matched, thrift); }
// There could be multiple breakpoints at one place but we can manage this // with only one breakpoint. BreakPointInfoPtr DebuggerProxy::getBreakPointAtCmd(CmdInterrupt& cmd) { TRACE(2, "DebuggerProxy::getBreakPointAtCmd\n"); for (unsigned int i = 0; i < m_breakpoints.size(); ++i) { BreakPointInfoPtr bp = m_breakpoints[i]; if (bp->m_state != BreakPointInfo::Disabled && bp->match(cmd.getInterruptType(), *cmd.getSite())) { return bp; } } return BreakPointInfoPtr(); }
bool CmdBreak::onClient(DebuggerClient *client) { if (DebuggerCommand::onClient(client)) return true; bool regex = false; BreakPointInfo::State state = BreakPointInfo::Always; int index = 1; if (client->arg(1, "regex")) { regex = true; index++; } else if (client->arg(1, "once")) { state = BreakPointInfo::Once; index++; } else if (client->arg(1, "list")) { return processList(client); } else if (hasUpdateArg(client)) { return processUpdate(client); } string currentFile; int currentLine = 0; BreakPointInfoPtr loc = client->getCurrentLocation(); if (loc) { currentFile = loc->m_file; currentLine = loc->m_line1; } BreakPointInfoPtr bpi; InterruptType interrupt = (InterruptType)(-1); if (client->argCount() == 0) { if (currentFile.empty() || currentLine == 0) { client->error("There is no current file or line to set breakpoint. " "You will have to specify source file location yourself."); return true; } bpi = BreakPointInfoPtr(new BreakPointInfo(regex, state, currentFile.c_str(), currentLine)); } else if (client->arg(index, "start")) { interrupt = RequestStarted; } else if (client->arg(index, "end")) { interrupt = RequestEnded; } else if (client->arg(index, "psp")) { interrupt = PSPEnded; } else { bpi = BreakPointInfoPtr(new BreakPointInfo(regex, state, BreakPointReached, client->argValue(index), currentFile)); } if (interrupt >= 0) { string url; if (!client->arg(index + 1, "if") && !client->arg(index + 1, "&&")) { url = client->argValue(++index); } bpi = BreakPointInfoPtr(new BreakPointInfo(regex, state, interrupt, url)); } if (!validate(client, bpi, index)) { client->tutorial( "This is the order of different arguments:\n" "\n" "\t[b]reak [o]nce {exp} if|&& {php}\n" "\n" "These are the components in a breakpoint {exp}:\n" "\n" "\tfile location: {file}:{line}\n" "\tfunction call: {func}()\n" "\tmethod invoke: {cls}::{method}()\n" ); } return true; }