diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp index e3d8e1e107d22633364e5a12a0de3fe299ec6a31..6e892b54b029bbf46154eee47c33550029ef08e0 100644 --- a/src/plugins/debugger/breakhandler.cpp +++ b/src/plugins/debugger/breakhandler.cpp @@ -604,10 +604,15 @@ QVariant BreakHandler::data(const QModelIndex &mi, int role) const //|| data.type == BreakpointAtVFork || data.type == BreakpointAtSysCall) return typeToString(data.type); - if (data.type == WatchpointAtAddress) - return tr("Data at 0x%1").arg(data.address, 0, 16); - if (data.type == WatchpointAtExpression) - return tr("Data at %1").arg(data.expression); + if (data.type == WatchpointAtAddress) { + quint64 address = response.address ? response.address : data.address; + return tr("Data at 0x%1").arg(address, 0, 16); + } + if (data.type == WatchpointAtExpression) { + QString expression = !response.expression.isEmpty() + ? response.expression : data.expression; + return tr("Data at %1").arg(expression); + } return empty; } break; @@ -1052,11 +1057,14 @@ void BreakHandler::appendBreakpoint(const BreakpointParameters &data) scheduleSynchronization(); } -void BreakHandler::handleAlienBreakpoint(BreakpointModelId id, - const BreakpointResponse &response, DebuggerEngine *engine) +void BreakHandler::handleAlienBreakpoint(const BreakpointResponse &response, DebuggerEngine *engine) { - if (response.id.isMinor()) { - insertSubBreakpoint(id, response); + BreakpointModelId id = findSimilarBreakpoint(response); + if (id.isValid()) { + if (response.id.isMinor()) + insertSubBreakpoint(id, response); + else + setResponse(id, response); } else { BreakpointModelId id(++currentId); const int row = m_storage.size(); @@ -1066,10 +1074,6 @@ void BreakHandler::handleAlienBreakpoint(BreakpointModelId id, endInsertRows(); it->data = response; - it->data.type = BreakpointByFileAndLine; - it->data.functionName.clear(); - it->data.address = 0; - it->response = response; it->state = BreakpointInserted; it->engine = engine; diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h index ca003552f912e5f84ecd56d8c566449939cfc4e3..04475bc80d67a390011e9caa93eb3a394398dccb 100644 --- a/src/plugins/debugger/breakhandler.h +++ b/src/plugins/debugger/breakhandler.h @@ -70,8 +70,7 @@ public: // The only way to add a new breakpoint. void appendBreakpoint(const BreakpointParameters &data); - void handleAlienBreakpoint(BreakpointModelId id, - const BreakpointResponse &response, DebuggerEngine *engine); + void handleAlienBreakpoint(const BreakpointResponse &response, DebuggerEngine *engine); void insertSubBreakpoint(BreakpointModelId id, const BreakpointResponse &data); void removeAlienBreakpoint(BreakpointModelId id); diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index f163acc2a6ab2a0a5b1d511291f642a67d590f5f..7e0a941122ee67facdf8d64620d90c818856517d 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -518,13 +518,15 @@ void GdbEngine::handleResponse(const QByteArray &buff) } else if (asyncClass == "breakpoint-created") { // "{bkpt={number="1",type="breakpoint",disp="del",enabled="y", // addr="<PENDING>",pending="main",times="0", - //original-location="main"}}" + // original-location="main"}}" -- or -- + // {bkpt={number="2",type="hw watchpoint",disp="keep",enabled="y", + // what="*0xbfffed48",times="0",original-location="*0xbfffed48" BreakHandler *handler = breakHandler(); foreach (const GdbMi &bkpt, result.children()) { BreakpointResponse br; + br.type = BreakpointByFileAndLine; updateResponse(br, bkpt); - BreakpointModelId id = handler->findBreakpointByResponseId(br.id); - handler->handleAlienBreakpoint(id, br, this); + handler->handleAlienBreakpoint(br, this); } } else if (asyncClass == "breakpoint-deleted") { // "breakpoint-deleted" "{id="1"}" @@ -2380,11 +2382,21 @@ void GdbEngine::updateResponse(BreakpointResponse &response, const GdbMi &bkpt) } else if (child.hasName("thread")) { response.threadSpec = child.data().toInt(); } else if (child.hasName("type")) { - // "breakpoint", "hw breakpoint", "tracepoint" - if (child.data().contains("tracepoint")) + // "breakpoint", "hw breakpoint", "tracepoint", "hw watchpoint" + // {bkpt={number="2",type="hw watchpoint",disp="keep",enabled="y", + // what="*0xbfffed48",times="0",original-location="*0xbfffed48" + if (child.data().contains("tracepoint")) { response.tracepoint = true; - else if (!child.data().contains("reakpoint")) - response.type = WatchpointAtAddress; + } else if (child.data() == "hw watchpoint" || child.data() == "watchpoint") { + QByteArray what = bkpt.findChild("what").data(); + if (what.startsWith("*0x")) { + response.type = WatchpointAtAddress; + response.address = what.mid(1).toULongLong(0, 0); + } else { + response.type = WatchpointAtExpression; + response.expression = QString::fromLocal8Bit(what); + } + } } else if (child.hasName("original-location")) { originalLocation = child.data(); }