debugger: refactor watch point lookup

In preparation of bitfield watch points.
This commit is contained in:
hjk
2011-03-01 19:16:24 +01:00
parent b0b8a452c1
commit 2780ff6f22
6 changed files with 30 additions and 31 deletions

View File

@@ -240,33 +240,18 @@ const BreakpointParameters &BreakHandler::breakpointData(BreakpointId id) const
return it->data; return it->data;
} }
BreakpointId BreakHandler::findWatchpointByAddress(quint64 address) const BreakpointId BreakHandler::findWatchpoint(const BreakpointParameters &data) const
{ {
ConstIterator it = m_storage.constBegin(), et = m_storage.constEnd(); ConstIterator it = m_storage.constBegin(), et = m_storage.constEnd();
for ( ; it != et; ++it) for ( ; it != et; ++it)
if (it->data.isWatchpoint() && it->data.address == address) if (it->data.isWatchpoint()
&& it->data.address == data.address
&& it->data.size == data.size
&& it->data.bitpos == data.bitpos)
return it.key(); return it.key();
return BreakpointId(); return BreakpointId();
} }
void BreakHandler::setWatchpointByAddress(quint64 address)
{
const int id = findWatchpointByAddress(address);
if (id) {
qDebug() << "WATCHPOINT EXISTS";
// removeBreakpoint(index);
return;
}
BreakpointParameters data(Watchpoint);
data.address = address;
appendBreakpoint(data);
}
bool BreakHandler::hasWatchpointAt(quint64 address) const
{
return findWatchpointByAddress(address);
}
void BreakHandler::saveBreakpoints() void BreakHandler::saveBreakpoints()
{ {
const QString one = _("1"); const QString one = _("1");

View File

@@ -80,12 +80,10 @@ public:
// Find a breakpoint matching approximately the data in needle. // Find a breakpoint matching approximately the data in needle.
BreakpointId findSimilarBreakpoint(const BreakpointResponse &needle) const; BreakpointId findSimilarBreakpoint(const BreakpointResponse &needle) const;
BreakpointId findBreakpointByNumber(int bpNumber) const; BreakpointId findBreakpointByNumber(int bpNumber) const;
BreakpointId findWatchpointByAddress(quint64 address) const; BreakpointId findWatchpoint(const BreakpointParameters &data) const;
BreakpointId findBreakpointByFunction(const QString &functionName) const; BreakpointId findBreakpointByFunction(const QString &functionName) const;
BreakpointId findBreakpointByIndex(const QModelIndex &index) const; BreakpointId findBreakpointByIndex(const QModelIndex &index) const;
BreakpointIds findBreakpointsByIndex(const QList<QModelIndex> &list) const; BreakpointIds findBreakpointsByIndex(const QList<QModelIndex> &list) const;
void setWatchpointByAddress(quint64 address);
bool hasWatchpointAt(quint64 address) const;
void updateMarkers(); void updateMarkers();
static QIcon breakpointIcon(); static QIcon breakpointIcon();

View File

@@ -53,7 +53,8 @@ namespace Internal {
BreakpointParameters::BreakpointParameters(BreakpointType t) BreakpointParameters::BreakpointParameters(BreakpointType t)
: type(t), enabled(true), pathUsage(BreakpointPathUsageEngineDefault), : type(t), enabled(true), pathUsage(BreakpointPathUsageEngineDefault),
ignoreCount(0), lineNumber(0), address(0), threadSpec(-1), ignoreCount(0), lineNumber(0), address(0), size(0),
bitpos(0), bitsize(0), threadSpec(-1),
tracepoint(false) tracepoint(false)
{} {}

View File

@@ -107,6 +107,9 @@ public:
int ignoreCount; //!< Ignore count associated with breakpoint. int ignoreCount; //!< Ignore count associated with breakpoint.
int lineNumber; //!< Line in source file. int lineNumber; //!< Line in source file.
quint64 address; //!< Address for watchpoints. quint64 address; //!< Address for watchpoints.
uint size; //!< Size of watched area for watchpoints.
uint bitpos; //!< Location of watched bitfield within watched area.
uint bitsize; //!< Size of watched bitfield within watched area.
int threadSpec; //!< Thread specification. int threadSpec; //!< Thread specification.
QString functionName; QString functionName;
QString module; //!< module for file name QString module; //!< module for file name

View File

@@ -724,17 +724,21 @@ QVariant WatchModel::data(const QModelIndex &idx, int role) const
return pointerValue(data.value); return pointerValue(data.value);
return QVariant(quint64(0)); return QVariant(quint64(0));
case LocalsIsWatchpointAtAddressRole: case LocalsIsWatchpointAtAddressRole: {
return engine()->breakHandler() BreakpointParameters bp(Watchpoint);
->hasWatchpointAt(data.coreAddress()); bp.address = data.coreAddress();
return engine()->breakHandler()->findWatchpoint(bp) != 0;
}
case LocalsAddressRole: case LocalsAddressRole:
return data.coreAddress(); return data.coreAddress();
case LocalsIsWatchpointAtPointerValueRole: case LocalsIsWatchpointAtPointerValueRole:
if (isPointerType(data.type)) if (isPointerType(data.type)) {
return engine()->breakHandler() BreakpointParameters bp(Watchpoint);
->hasWatchpointAt(pointerValue(data.value)); bp.address = pointerValue(data.value);
return engine()->breakHandler()->findWatchpoint(bp) != 0;
}
return false; return false;
default: default:

View File

@@ -654,7 +654,15 @@ void WatchWindow::setModelData
void WatchWindow::setWatchpoint(quint64 address) void WatchWindow::setWatchpoint(quint64 address)
{ {
breakHandler()->setWatchpointByAddress(address); BreakpointParameters data(Watchpoint);
data.address = address;
BreakpointId id = breakHandler()->findWatchpoint(data);
if (id) {
qDebug() << "WATCHPOINT EXISTS";
// removeBreakpoint(index);
return;
}
breakHandler()->appendBreakpoint(data);
} }
} // namespace Internal } // namespace Internal