forked from qt-creator/qt-creator
debugger: refactor watch point lookup
In preparation of bitfield watch points.
This commit is contained in:
@@ -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");
|
||||||
|
@@ -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();
|
||||||
|
@@ -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)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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:
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user