void CmdInterrupt::setClientOutput(DebuggerClient &client) { client.setOutputType(DebuggerClient::OTCodeLoc); client.setOTFileLine(m_bpi->m_file, m_bpi->m_line1); Array values; DebuggerClient::WatchPtrVec &watches = client.getWatches(); for (int i = 0; i < (int)watches.size(); i++) { ArrayInit watch(3); watch.set(s_format, watches[i]->first); watch.set(s_php, watches[i]->second); Variant v = CmdPrint().processWatch(client, watches[i]->first, watches[i]->second); watch.set(s_value, CmdPrint::FormatResult(watches[i]->first, v)); values.append(watch.create()); } client.setOTValues(values); }
void CmdPrint::processList(DebuggerClient &client) { DebuggerClient::WatchPtrVec &watches = client.getWatches(); for (int i = 0; i < (int)watches.size(); i++) { client.print(" %d %s %s", i + 1, StringUtil::Pad(watches[i]->first, 8, " ", StringUtil::PadType::Left).data(), watches[i]->second.c_str()); } if (watches.empty()) { client.tutorial( "Use '[p]rint [a]lways ...' to set new watch expressions. " "Use '[p]rint ?|[h]elp' to read how to set them. " ); } else { client.tutorial( "Use '[p]rint [c]lear {index}|[a]ll' to remove watch expression(s). " ); } }
void CmdPrint::processClear(DebuggerClient &client) { DebuggerClient::WatchPtrVec &watches = client.getWatches(); if (watches.empty()) { client.error("There is no watch expression to clear."); client.tutorial( "Use '[p]rint [a]lways ...' to set new watch expressions. " "Use '[p]rint ?|[h]elp' to read how to set them. " ); return; } if (client.arg(2, "all")) { watches.clear(); client.info("All watch expressions are cleared."); return; } string snum = client.argValue(2); if (!DebuggerClient::IsValidNumber(snum)) { client.error("'[p]rint [c]lear' needs an {index} argument."); client.tutorial( "You will have to run '[p]rint [l]ist' first to see a list of valid " "numbers or indices to specify." ); return; } int num = atoi(snum.c_str()) - 1; if (num < 0 || num >= (int)watches.size()) { client.error("\"%s\" is not a valid index. Choose one from this list:", snum.c_str()); processList(client); return; } watches.erase(watches.begin() + num); }
void CmdPrint::setClientOutput(DebuggerClient &client) { client.setOutputType(DebuggerClient::OTValues); Array values; if (m_isForWatch) { // Manipulating the watch list, output the current list DebuggerClient::WatchPtrVec &watches = client.getWatches(); for (int i = 0; i < (int)watches.size(); i++) { ArrayInit watch(2); watch.set(s_format, watches[i]->first); watch.set(s_php, watches[i]->second); values.append(watch.create()); } } else { // Just print an expression, do similar output as eval values.set(s_body, m_body); if (client.getDebuggerClientApiModeSerialize()) { values.set(s_value_serialize, DebuggerClient::FormatVariable(m_ret, 200)); } else { values.set(s_value, m_ret); } } client.setOTValues(values); }
void CmdInterrupt::onClient(DebuggerClient &client) { client.setCurrentLocation(m_threadId, m_bpi); if (!client.getDebuggerClientSmallStep()) { // Adjust line and char if it's not small stepping if (m_bpi->m_line1 == m_bpi->m_line2) { m_bpi->m_char1 = 1; m_bpi->m_char2 = 100; } } client.setMatchedBreakPoints(m_matched); switch (m_interrupt) { case SessionStarted: if (!m_program.empty()) { client.info("Program %s loaded. Type '[r]un' or '[c]ontinue' to go.", m_program.c_str()); m_bpi->m_file = m_program; } break; case SessionEnded: if (!m_program.empty()) { client.info("Program %s exited normally.", m_program.c_str()); } break; case RequestStarted: if (!m_program.empty()) { client.info("Web request %s started.", m_program.c_str()); } break; case RequestEnded: if (!m_program.empty()) { client.info("Web request %s ended.", m_program.c_str()); } break; case PSPEnded: if (!m_program.empty()) { client.info("Post-Send Processing for %s was ended.", m_program.c_str()); } break; case HardBreakPoint: case BreakPointReached: case ExceptionThrown: { bool found = false; bool toggled = false; auto *bps = client.getBreakPoints(); for (unsigned int i = 0; i < m_matched.size(); i++) { BreakPointInfoPtr bpm = m_matched[i]; BreakPointInfoPtr bp; int index = 0; for (; index < (int)bps->size(); index++) { if (bpm->same((*bps)[index])) { bp = (*bps)[index]; break; } } if (bp) { found = true; if (bp->m_state == BreakPointInfo::Once) { bp->m_state = BreakPointInfo::Disabled; toggled = true; } if (m_interrupt == BreakPointReached || m_interrupt == HardBreakPoint) { client.info("Breakpoint %d reached %s", bp->index(), m_bpi->site().c_str()); client.shortCode(m_bpi); } else { if (m_bpi->m_exceptionClass == BreakPointInfo::ErrorClassName) { client.info("Breakpoint %d reached: An error occurred %s", bp->index(), m_bpi->site().c_str()); client.shortCode(m_bpi); client.error("Error Message: %s", m_bpi->m_exceptionObject.c_str()); } else { client.info("Breakpoint %d reached: Throwing %s %s", bp->index(), m_bpi->m_exceptionClass.c_str(), m_bpi->site().c_str()); client.shortCode(m_bpi); if (client.getLogFileHandler()) { client.output(m_bpi->m_exceptionObject); } } } if (!bpm->m_output.empty()) { client.print(bpm->m_output); } } } if (toggled) { CmdBreak::SendClientBreakpointListToServer(client); } if (!found) { if (m_interrupt == HardBreakPoint) { // for HardBreakPoint, default the frame to the caller client.setFrame(1); } client.info("Break %s", m_bpi->site().c_str()); client.shortCode(m_bpi); } break; } } if (!m_errorMsg.empty()) { client.error(m_errorMsg); } // watches switch (m_interrupt) { case SessionStarted: case RequestStarted: break; default: { DebuggerClient::WatchPtrVec &watches = client.getWatches(); for (int i = 0; i < (int)watches.size(); i++) { if (i > 0) client.output("%s", ""); client.info("Watch %d: %s =", i + 1, watches[i]->second.c_str()); Variant v = CmdPrint().processWatch(client, watches[i]->first, watches[i]->second); client.output(CmdPrint::FormatResult(watches[i]->first, v)); } } } }