diff options
-rw-r--r-- | src/plugins/debugger/breakhandler.cpp | 8 | ||||
-rw-r--r-- | src/plugins/debugger/breakhandler.h | 2 | ||||
-rw-r--r-- | src/plugins/debugger/watchwindow.cpp | 21 |
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; |