OSDN Git Service

debugger: better protection from infinite loops due to broken dumpers in
authorhjk <qtc-committer@nokia.com>
Wed, 28 Oct 2009 10:50:58 +0000 (11:50 +0100)
committerhjk <qtc-committer@nokia.com>
Wed, 28 Oct 2009 10:50:58 +0000 (11:50 +0100)
synchroneous mode

src/plugins/debugger/gdb/gdbengine.cpp
src/plugins/debugger/watchhandler.cpp

index b2e8187..dff189c 100644 (file)
@@ -3363,6 +3363,7 @@ void GdbEngine::updateLocals(const QVariant &cookie)
 {
     m_pendingRequests = 0;
     if (isSynchroneous()) {
+        m_processedNames.clear();
         manager()->watchHandler()->beginCycle();
         m_toolTipExpression.clear();
         QStringList expanded = m_manager->watchHandler()->expandedINames().toList();
index ba7c24f..1fe490c 100644 (file)
@@ -31,6 +31,7 @@
 #include "watchutils.h"
 #include "debuggeractions.h"
 #include "debuggermanager.h"
+#include "idebuggerengine.h"
 
 #if USE_MODEL_TEST
 #include "modeltest.h"
@@ -1124,8 +1125,18 @@ void WatchHandler::insertData(const WatchData &data)
         return;
     }
     if (data.isSomethingNeeded() && data.iname.contains('.')) {
-        MODEL_DEBUG("SOMETHING NEEDED: " << data.toString());
-        m_manager->updateWatchData(data);
+        MODEL_DEBUGX("SOMETHING NEEDED: " << data.toString());
+        if (!m_manager->currentEngine()->isSynchroneous()) {
+            m_manager->updateWatchData(data);
+        } else {
+            qDebug() << "ENDLESS LOOP: SOMETHING NEEDED: " << data.toString();
+            WatchData data1 = data;
+            data1.setAllUnneeded();
+            data1.setValue(QLatin1String("<unavailable synchroneous data>"));
+            data1.setHasChildren(false);
+            WatchModel *model = modelForIName(data.iname);
+            model->insertData(data1);
+        }
     } else {
         WatchModel *model = modelForIName(data.iname);
         QTC_ASSERT(model, return);