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;