static bool gdbmiFormatBreakpoint(std::ostream &str, IDebugBreakpoint *bp, CIDebugSymbols *symbols /* = 0 */, CIDebugDataSpaces *dataSpaces /* = 0 */, unsigned verbose, std::string *errorMessage) { enum { BufSize = 512 }; ULONG flags = 0; ULONG id = 0; if (SUCCEEDED(bp->GetId(&id))) str << ",id=\"" << id << '"'; HRESULT hr = bp->GetFlags(&flags); if (FAILED(hr)) { *errorMessage = msgDebugEngineComFailed("GetFlags", hr); return false; } const bool deferred = (flags & DEBUG_BREAKPOINT_DEFERRED) != 0; formatGdbmiFlag(str, ",deferred", deferred); formatGdbmiFlag(str, ",enabled", (flags & DEBUG_BREAKPOINT_ENABLED) != 0); if (verbose) { formatGdbmiFlag(str, ",oneshot", (flags & DEBUG_BREAKPOINT_ONE_SHOT) != 0); str << ",flags=\"" << flags << '"'; ULONG threadId = 0; if (SUCCEEDED(bp->GetMatchThreadId(&threadId))) // Fails if none set str << ",thread=\"" << threadId << '"'; ULONG passCount = 0; if (SUCCEEDED(bp->GetPassCount(&passCount))) str << ",passcount=\"" << passCount << '"'; } // Offset: Fails for deferred ones if (!deferred) { const std::pair<ULONG64, ULONG> memoryRange = breakPointMemoryRange(bp); if (memoryRange.first) { str << ",address=\"" << std::hex << std::showbase << memoryRange.first << std::dec << std::noshowbase << '"'; // Resolve module to be specified in next run for speed-up. if (symbols) { const std::string module = moduleNameByOffset(symbols, memoryRange.first); if (!module.empty()) str << ",module=\"" << module << '"'; } // symbols // Report the memory of watchpoints for comparing bitfields if (dataSpaces && memoryRange.second > 0) { str << ",size=\"" << memoryRange.second << '"'; const std::wstring memoryHex = memoryToHexW(dataSpaces, memoryRange.first, memoryRange.second); if (!memoryHex.empty()) str << ",memory=\"" << gdbmiWStringFormat(memoryHex) << '"'; } } // Got address } // !deferred // Expression if (verbose > 1) { char buf[BufSize]; if (SUCCEEDED(bp->GetOffsetExpression(buf, BUFSIZ, 0))) str << ",expression=\"" << gdbmiStringFormat(buf) << '"'; } return true; }
void Thread::formatGDBMI(std::ostream &str) const { str << "{id=\"" << id << "\",target-id=\"" << systemId << "\","; frame.formatGDBMI(str); if (!name.empty()) str << ",name=\"" << gdbmiWStringFormat(name) << '"'; if (!state.empty()) str << ",state=\"" << state << '"'; str << '}'; }
std::string gdbmiRegisters(CIDebugRegisters *regs, CIDebugControl *control, bool humanReadable, unsigned flags, std::string *errorMessage) { if (regs == 0 || control == 0) { *errorMessage = "Required interfaces missing for registers dump."; return std::string(); } const Registers registers = getRegisters(regs, flags, errorMessage); if (registers.empty()) return std::string(); std::ostringstream str; str << '['; if (humanReadable) str << '\n'; const Registers::size_type size = registers.size(); for (Registers::size_type r = 0; r < size; ++r) { const Register ® = registers.at(r); if (r) str << ','; str << "{number=\"" << r << "\",name=\"" << gdbmiWStringFormat(reg.name) << '"'; if (!reg.description.empty()) str << ",description=\"" << gdbmiWStringFormat(reg.description) << '"'; if (reg.subRegister) str << ",subregister=\"true\""; if (reg.pseudoRegister) str << ",pseudoregister=\"true\""; str << ",value=\""; formatDebugValue(str, reg.value, control); str << "\"}"; if (humanReadable) str << '\n'; } str << ']'; if (humanReadable) str << '\n'; return str.str(); }
void StackFrame::formatGDBMI(std::ostream &str, unsigned level) const { str << "frame={level=\"" << level << "\",addr=\"0x" << std::hex << address << std::dec << '"'; if (!function.empty()) { // Split into module/function const std::wstring::size_type exclPos = function.find('!'); if (exclPos == std::wstring::npos) { str << ",func=\"" << gdbmiWStringFormat(function) << '"'; } else { const std::wstring module = function.substr(0, exclPos); const std::wstring fn = function.substr(exclPos + 1, function.size() - exclPos - 1); str << ",func=\"" << gdbmiWStringFormat(fn) << "\",from=\"" << gdbmiWStringFormat(module) << '"'; } } if (!fullPathName.empty()) { // Creator/gdbmi expects 'clean paths' std::wstring cleanPath = fullPathName; replace(cleanPath, L'\\', L'/'); str << ",fullname=\"" << gdbmiWStringFormat(fullPathName) << "\",file=\"" << gdbmiWStringFormat(fileName()) << "\",line=\"" << line << '"'; } str << '}'; }
std::string wStringToGdbmiString(const std::wstring &w) { std::ostringstream str; str << gdbmiWStringFormat(w); return str.str(); }