forked from qt-creator/qt-creator
Debugger: Prevent adding invalid breakpoints.
Check on session restore and add. In particular, suppress watchpoints at 0x0, which hang gdb. Change-Id: I648f53a709fabdebe641e478f367f1354a315ab1 Reviewed-by: hjk <qthjk@ovi.com>
This commit is contained in:
@@ -396,7 +396,11 @@ void BreakHandler::loadBreakpoints()
|
|||||||
v = map.value(_("message"));
|
v = map.value(_("message"));
|
||||||
if (v.isValid())
|
if (v.isValid())
|
||||||
data.message = v.toString();
|
data.message = v.toString();
|
||||||
appendBreakpoint(data);
|
if (data.isValid()) {
|
||||||
|
appendBreakpoint(data);
|
||||||
|
} else {
|
||||||
|
qWarning("Not restoring invalid breakpoint: %s", qPrintable(data.toString()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//qDebug() << "LOADED BREAKPOINTS" << this << list.size();
|
//qDebug() << "LOADED BREAKPOINTS" << this << list.size();
|
||||||
}
|
}
|
||||||
@@ -1036,7 +1040,11 @@ static int currentId = 0;
|
|||||||
|
|
||||||
void BreakHandler::appendBreakpoint(const BreakpointParameters &data)
|
void BreakHandler::appendBreakpoint(const BreakpointParameters &data)
|
||||||
{
|
{
|
||||||
QTC_ASSERT(data.type != UnknownType, return);
|
if (!data.isValid()) {
|
||||||
|
qWarning("Not adding invalid breakpoint: %s", qPrintable(data.toString()));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
BreakpointModelId id(++currentId);
|
BreakpointModelId id(++currentId);
|
||||||
const int row = m_storage.size();
|
const int row = m_storage.size();
|
||||||
beginInsertRows(QModelIndex(), row, row);
|
beginInsertRows(QModelIndex(), row, row);
|
||||||
|
|||||||
@@ -220,6 +220,33 @@ BreakpointParts BreakpointParameters::differencesTo
|
|||||||
return parts;
|
return parts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool BreakpointParameters::isValid() const
|
||||||
|
{
|
||||||
|
switch (type) {
|
||||||
|
case Debugger::Internal::BreakpointByFileAndLine:
|
||||||
|
return !fileName.isEmpty() && lineNumber > 0;
|
||||||
|
case Debugger::Internal::BreakpointByFunction:
|
||||||
|
return !functionName.isEmpty();
|
||||||
|
case Debugger::Internal::WatchpointAtAddress:
|
||||||
|
case Debugger::Internal::BreakpointByAddress:
|
||||||
|
return address != 0;
|
||||||
|
case Debugger::Internal::BreakpointAtThrow:
|
||||||
|
case Debugger::Internal::BreakpointAtCatch:
|
||||||
|
case Debugger::Internal::BreakpointAtMain:
|
||||||
|
case Debugger::Internal::BreakpointAtFork:
|
||||||
|
case Debugger::Internal::BreakpointAtExec:
|
||||||
|
case Debugger::Internal::BreakpointAtSysCall:
|
||||||
|
case Debugger::Internal::BreakpointOnQmlSignalHandler:
|
||||||
|
case Debugger::Internal::BreakpointAtJavaScriptThrow:
|
||||||
|
break;
|
||||||
|
case Debugger::Internal::WatchpointAtExpression:
|
||||||
|
return !expression.isEmpty();
|
||||||
|
case Debugger::Internal::UnknownType:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool BreakpointParameters::equals(const BreakpointParameters &rhs) const
|
bool BreakpointParameters::equals(const BreakpointParameters &rhs) const
|
||||||
{
|
{
|
||||||
return !differencesTo(rhs);
|
return !differencesTo(rhs);
|
||||||
|
|||||||
@@ -203,6 +203,7 @@ class BreakpointParameters
|
|||||||
public:
|
public:
|
||||||
explicit BreakpointParameters(BreakpointType = UnknownType);
|
explicit BreakpointParameters(BreakpointType = UnknownType);
|
||||||
BreakpointParts differencesTo(const BreakpointParameters &rhs) const;
|
BreakpointParts differencesTo(const BreakpointParameters &rhs) const;
|
||||||
|
bool isValid() const;
|
||||||
bool equals(const BreakpointParameters &rhs) const;
|
bool equals(const BreakpointParameters &rhs) const;
|
||||||
bool conditionsMatch(const QByteArray &other) const;
|
bool conditionsMatch(const QByteArray &other) const;
|
||||||
bool isWatchpoint() const
|
bool isWatchpoint() const
|
||||||
|
|||||||
Reference in New Issue
Block a user