diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 05eecab488ebf843a394ee606c26922a6f7ade1c..23e0b23038fa4a73070b87900c6ffae5db16b222 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -2902,6 +2902,18 @@ void GdbEngine::runDebuggingHelper(const WatchData &data0, bool dumpChildren)
     }
     WatchData data = data0;
 
+    // Avoid endless loops created by faulty dumpers
+    if (m_processedNames.contains(data.iname)) {
+        emit gdbInputAvailable(LogStatus,
+            _("<Breaking endless loop for %1>").arg(data.iname));
+        data.setAllUnneeded();
+        data.setValue(_("<unavailable>"));
+        data.setHasChildren(false);
+        insertData(data);
+        return; 
+    }
+    m_processedNames.insert(data.iname);
+
     QByteArray params;
     QStringList extraArgs;
     const QtDumperHelper::TypeData td = m_dumperHelper.typeData(data0.type);
@@ -3531,6 +3543,7 @@ void GdbEngine::updateLocals()
         tryQueryDebuggingHelpers();
 
     m_pendingRequests = 0;
+    m_processedNames.clear();
 
     PENDING_DEBUG("\nRESET PENDING");
     //m_toolTipCache.clear();
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index 74134e8d37a5c006096e8ea480888976d45c2b04..405951e61a121dfd8ae623ed5ef0c52c865d4473 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -374,6 +374,7 @@ private:
     QString parseDisassembler(const GdbMi &lines);
 
     int m_pendingRequests;
+    QSet<QString> m_processedNames; 
 
     QtDumperHelper m_dumperHelper;