OSDN Git Service

Debugger: Prevent adding invalid breakpoints.
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>
Thu, 20 Oct 2011 08:45:59 +0000 (10:45 +0200)
committerhjk <qthjk@ovi.com>
Thu, 20 Oct 2011 08:51:09 +0000 (10:51 +0200)
Check on session restore and add.
In particular, suppress watchpoints at 0x0,
which hang gdb.

Change-Id: I648f53a709fabdebe641e478f367f1354a315ab1
Reviewed-by: hjk <qthjk@ovi.com>
src/plugins/debugger/breakhandler.cpp
src/plugins/debugger/breakpoint.cpp
src/plugins/debugger/breakpoint.h

index 0bc771d..e80b898 100644 (file)
@@ -396,7 +396,11 @@ void BreakHandler::loadBreakpoints()
         v = map.value(_("message"));
         if (v.isValid())
             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();
 }
@@ -1036,7 +1040,11 @@ static int currentId = 0;
 
 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);
     const int row = m_storage.size();
     beginInsertRows(QModelIndex(), row, row);
index c61892c..c0d9347 100644 (file)
@@ -220,6 +220,33 @@ BreakpointParts BreakpointParameters::differencesTo
     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
 {
     return !differencesTo(rhs);
index b1636be..a04a718 100644 (file)
@@ -203,6 +203,7 @@ class BreakpointParameters
 public:
     explicit BreakpointParameters(BreakpointType = UnknownType);
     BreakpointParts differencesTo(const BreakpointParameters &rhs) const;
+    bool isValid() const;
     bool equals(const BreakpointParameters &rhs) const;
     bool conditionsMatch(const QByteArray &other) const;
     bool isWatchpoint() const