summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/debugger/breakhandler.cpp28
-rw-r--r--src/plugins/debugger/breakhandler.h2
-rw-r--r--src/plugins/debugger/gdb/gdbengine.cpp9
-rw-r--r--src/plugins/debugger/gdb/gdbmi.cpp2
-rw-r--r--src/plugins/debugger/watchdata.cpp17
5 files changed, 36 insertions, 22 deletions
diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp
index 0e73359e27..e6418cfb08 100644
--- a/src/plugins/debugger/breakhandler.cpp
+++ b/src/plugins/debugger/breakhandler.cpp
@@ -303,9 +303,6 @@ void BreakHandler::saveBreakpoints()
for ( ; it != et; ++it) {
const BreakpointParameters &data = it->data;
QMap<QString, QVariant> map;
- // Do not persist Watchpoints.
- if (data.isWatchpoint())
- continue;
if (data.type != BreakpointByFileAndLine)
map.insert(_("type"), data.type);
if (!data.fileName.isEmpty())
@@ -332,6 +329,8 @@ void BreakHandler::saveBreakpoints()
map.insert(_("module"), data.module);
if (!data.command.isEmpty())
map.insert(_("command"), data.command);
+ if (!data.expression.isEmpty())
+ map.insert(_("expression"), data.expression);
list.append(map);
}
debuggerCore()->setSessionValue("Breakpoints", list);
@@ -387,6 +386,9 @@ void BreakHandler::loadBreakpoints()
v = map.value(_("command"));
if (v.isValid())
data.command = v.toString();
+ v = map.value(_("expression"));
+ if (v.isValid())
+ data.expression = v.toString();
appendBreakpoint(data);
}
//qDebug() << "LOADED BREAKPOINTS" << this << list.size();
@@ -521,9 +523,9 @@ QVariant BreakHandler::data(const QModelIndex &mi, int role) const
|| data.type == BreakpointAtSysCall)
return typeToString(data.type);
if (data.type == WatchpointAtAddress)
- return tr("Data breakpoint at 0x%1").arg(data.address, 0, 16);
+ return tr("Data at 0x%1").arg(data.address, 0, 16);
if (data.type == WatchpointAtExpression)
- return tr("Data breakpoint at %1").arg(data.expression);
+ return tr("Data at %1").arg(data.expression);
return empty;
}
break;
@@ -882,6 +884,10 @@ void BreakHandler::notifyBreakpointReleased(BreakpointId id)
it->response = BreakpointResponse();
delete it->marker;
it->marker = 0;
+ if (it->data.type == WatchpointAtAddress
+ || it->data.type == WatchpointAtExpression
+ || it->data.type == BreakpointByAddress)
+ it->data.enabled = false;
updateMarker(id);
layoutChanged();
}
@@ -1093,7 +1099,7 @@ bool BreakHandler::needsChange(BreakpointId id) const
}
void BreakHandler::setResponse(BreakpointId id,
- const BreakpointResponse &response, bool takeOver)
+ const BreakpointResponse &response)
{
Iterator it = m_storage.find(id);
BREAK_ASSERT(it != m_storage.end(), return);
@@ -1101,12 +1107,10 @@ void BreakHandler::setResponse(BreakpointId id,
item.response = response;
item.destroyMarker();
// Take over corrected values from response.
- if (takeOver) {
- if ((item.data.type == BreakpointByFileAndLine
- || item.data.type == BreakpointByFunction)
- && !response.module.isEmpty())
- item.data.module = response.module;
- }
+ if ((item.data.type == BreakpointByFileAndLine
+ || item.data.type == BreakpointByFunction)
+ && !response.module.isEmpty())
+ item.data.module = response.module;
updateMarker(id);
}
diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h
index 33f09507bc..09bfd60d12 100644
--- a/src/plugins/debugger/breakhandler.h
+++ b/src/plugins/debugger/breakhandler.h
@@ -137,7 +137,7 @@ public:
DebuggerEngine *engine(BreakpointId id) const;
void setEngine(BreakpointId id, DebuggerEngine *engine);
const BreakpointResponse &response(BreakpointId id) const;
- void setResponse(BreakpointId id, const BreakpointResponse &data, bool takeOver = true);
+ void setResponse(BreakpointId id, const BreakpointResponse &data);
bool needsChange(BreakpointId id) const;
// State transitions.
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 01299999fc..701806e0e6 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -2318,7 +2318,9 @@ void GdbEngine::handleWatchInsert(const GdbResponse &response)
// Mac yields:
//>32^done,wpt={number="4",exp="*4355182176"}
bresponse.number = wpt.findChild("number").data().toInt();
- bresponse.address = wpt.findChild("exp").toAddress();
+ QByteArray exp = wpt.findChild("exp").data();
+ if (exp.startsWith('*'))
+ bresponse.address = exp.mid(1).toULongLong(0, 0);
handler->setResponse(id, bresponse);
QTC_ASSERT(!handler->needsChange(id), /**/);
handler->notifyBreakpointInsertOk(id);
@@ -2327,9 +2329,10 @@ void GdbEngine::handleWatchInsert(const GdbResponse &response)
// Non-Mac: "Hardware watchpoint 2: *0xbfffed40\n"
const int end = ba.indexOf(':');
const int begin = ba.lastIndexOf(' ', end) + 1;
- const QByteArray address = ba.mid(end + 3).trimmed();
+ const QByteArray address = ba.mid(end + 2).trimmed();
bresponse.number = ba.mid(begin, end - begin).toInt();
- bresponse.address = address.toULongLong(0, 0);
+ if (address.startsWith('*'))
+ bresponse.address = address.mid(1).toULongLong(0, 0);
handler->setResponse(id, bresponse);
QTC_ASSERT(!handler->needsChange(id), /**/);
handler->notifyBreakpointInsertOk(id);
diff --git a/src/plugins/debugger/gdb/gdbmi.cpp b/src/plugins/debugger/gdb/gdbmi.cpp
index e93533e156..17abe88637 100644
--- a/src/plugins/debugger/gdb/gdbmi.cpp
+++ b/src/plugins/debugger/gdb/gdbmi.cpp
@@ -380,7 +380,7 @@ qulonglong GdbMi::toAddress() const
ba.chop(1);
if (ba.startsWith('*') || ba.startsWith('@'))
ba = ba.mid(1);
- return ba.toULongLong(0, 16);
+ return ba.toULongLong(0, 0);
}
//////////////////////////////////////////////////////////////////////////////////
diff --git a/src/plugins/debugger/watchdata.cpp b/src/plugins/debugger/watchdata.cpp
index c736f7e1f2..14dee8f87b 100644
--- a/src/plugins/debugger/watchdata.cpp
+++ b/src/plugins/debugger/watchdata.cpp
@@ -387,8 +387,10 @@ QString WatchData::toToolTip() const
QString WatchData::msgNotInScope()
{
- //: Value of variable in Debugger Locals display for variables out of scope (stopped above initialization).
- static const QString rc = QCoreApplication::translate("Debugger::Internal::WatchData", "<not in scope>");
+ //: Value of variable in Debugger Locals display for variables out
+ //: of scope (stopped above initialization).
+ static const QString rc =
+ QCoreApplication::translate("Debugger::Internal::WatchData", "<not in scope>");
return rc;
}
@@ -397,7 +399,8 @@ const QString &WatchData::shadowedNameFormat()
//: Display of variables shadowed by variables of the same name
//: in nested scopes: Variable %1 is the variable name, %2 is a
//: simple count.
- static const QString format = QCoreApplication::translate("Debugger::Internal::WatchData", "%1 <shadowed %2>");
+ static const QString format =
+ QCoreApplication::translate("Debugger::Internal::WatchData", "%1 <shadowed %2>");
return format;
}
@@ -415,12 +418,16 @@ quint64 WatchData::coreAddress() const
QByteArray WatchData::hexAddress() const
{
- return address ? (QByteArray("0x") + QByteArray::number(address, 16)) : QByteArray();
+ if (address)
+ return QByteArray("0x") + QByteArray::number(address, 16);
+ return QByteArray();
}
QByteArray WatchData::hexReferencingAddress() const
{
- return referencingAddress ? (QByteArray("0x") + QByteArray::number(referencingAddress, 16)) : QByteArray();
+ if (referencingAddress)
+ return QByteArray("0x") + QByteArray::number(referencingAddress, 16);
+ return QByteArray();
}
} // namespace Internal