summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/debugger/breakhandler.cpp8
-rw-r--r--src/plugins/debugger/breakhandler.h2
-rw-r--r--src/plugins/debugger/watchwindow.cpp21
3 files changed, 17 insertions, 14 deletions
diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp
index cb9aef370b..007544eaa2 100644
--- a/src/plugins/debugger/breakhandler.cpp
+++ b/src/plugins/debugger/breakhandler.cpp
@@ -407,20 +407,20 @@ BreakpointData *BreakHandler::findBreakpointByNumber(int bpNumber) const
return 0;
}
-BreakpointData *BreakHandler::findWatchPointByAddress(const QByteArray &a) const
+int BreakHandler::findWatchPointIndexByAddress(const QByteArray &a) const
{
for (int index = size() - 1; index >= 0; --index) {
BreakpointData *bd = at(index);
if (bd->type == BreakpointData::WatchpointType && bd->address == a)
- return bd;
+ return index;
}
- return 0;
+ return -1;
}
bool BreakHandler::watchPointAt(quint64 address) const
{
const QByteArray addressBA = QByteArray("0x") + QByteArray::number(address, 16);
- return findWatchPointByAddress(addressBA);
+ return findWatchPointIndexByAddress(addressBA) != -1;
}
void BreakHandler::saveBreakpoints()
diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h
index 4f800a77ff..7c9297dcc6 100644
--- a/src/plugins/debugger/breakhandler.h
+++ b/src/plugins/debugger/breakhandler.h
@@ -70,7 +70,7 @@ public:
// Find a breakpoint matching approximately the data in needle.bp*,
BreakpointData *findSimilarBreakpoint(const BreakpointData &needle) const;
BreakpointData *findBreakpointByNumber(int bpNumber) const;
- BreakpointData *findWatchPointByAddress(const QByteArray &a) const;
+ int findWatchPointIndexByAddress(const QByteArray &a) const;
bool watchPointAt(quint64 address) const;
void updateMarkers();
diff --git a/src/plugins/debugger/watchwindow.cpp b/src/plugins/debugger/watchwindow.cpp
index 2799a53d82..420c17d4b1 100644
--- a/src/plugins/debugger/watchwindow.cpp
+++ b/src/plugins/debugger/watchwindow.cpp
@@ -204,15 +204,18 @@ void WatchWindow::dropEvent(QDropEvent *ev)
//QTreeView::dropEvent(ev);
}
-static inline void addWatchPoint(DebuggerManager *manager, quint64 address)
+static inline void toggleWatchPoint(DebuggerManager *manager, quint64 address)
{
const QByteArray addressBA = QByteArray("0x") + QByteArray::number(address, 16);
- if (manager->breakHandler()->findWatchPointByAddress(addressBA))
- return;
- BreakpointData *data = new BreakpointData;
- data->type = BreakpointData::WatchpointType;
- data->address = addressBA;
- manager->breakHandler()->appendBreakpoint(data);
+ const int index = manager->breakHandler()->findWatchPointIndexByAddress(addressBA);
+ if (index == -1) {
+ BreakpointData *data = new BreakpointData;
+ data->type = BreakpointData::WatchpointType;
+ data->address = addressBA;
+ manager->breakHandler()->appendBreakpoint(data);
+ } else {
+ manager->breakHandler()->removeBreakpoint(index);
+ }
manager->attemptBreakpointSynchronization();
}
@@ -415,9 +418,9 @@ void WatchWindow::contextMenuEvent(QContextMenuEvent *ev)
(void) new MemoryViewAgent(m_manager, dialog.address());
}
} else if (act == actSetWatchPointAtVariableAddress) {
- addWatchPoint(m_manager, address);
+ toggleWatchPoint(m_manager, address);
} else if (act == actSetWatchPointAtPointerValue) {
- addWatchPoint(m_manager, pointerValue);
+ toggleWatchPoint(m_manager, pointerValue);
} else if (act == actSelectWidgetToWatch) {
grabMouse(Qt::CrossCursor);
m_grabbing = true;