From a1da606803e2804c12d6eb843ab8a055cee4dd33 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 28 Oct 2009 11:50:58 +0100 Subject: [PATCH] debugger: better protection from infinite loops due to broken dumpers in synchroneous mode --- src/plugins/debugger/gdb/gdbengine.cpp | 1 + src/plugins/debugger/watchhandler.cpp | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index b2e818724eb..dff189c96dd 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -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(); diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index ba7c24ff04f..1fe490c623f 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -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("")); + data1.setHasChildren(false); + WatchModel *model = modelForIName(data.iname); + model->insertData(data1); + } } else { WatchModel *model = modelForIName(data.iname); QTC_ASSERT(model, return);