aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhjk <hjk@theqtcompany.com>2016-04-15 15:01:12 +0200
committerhjk <hjk@theqtcompany.com>2016-04-18 10:38:58 +0000
commitad55631cdf898f0af6a9d0734c5f7a5889399da6 (patch)
tree0a612e115e9ad88a1a61090ea1a3c9845b9db51d
parentb2e048c10e19c245621b2fd4b475ad09aba18cb2 (diff)
Debugger: Add safety net to avoid infinite lookups
Do not lookup the same item twice without intermediate stepping. Dumpers could announce the existence of children but when asked for them bail out or produced similar inconsistent output. Better not depend on it. Task-number: QTCREATORBUG-15352 Change-Id: I38532d08bb438b12b6eb202a06ff610670b1069f Reviewed-by: Eike Ziller <eike.ziller@qt.io> Reviewed-by: Christian Stenger <christian.stenger@theqtcompany.com>
-rw-r--r--src/plugins/debugger/debuggerengine.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp
index 5a2c36452e..92dd21b994 100644
--- a/src/plugins/debugger/debuggerengine.cpp
+++ b/src/plugins/debugger/debuggerengine.cpp
@@ -282,6 +282,7 @@ public slots:
void resetLocation()
{
+ m_lookupRequests.clear();
m_locationTimer.stop();
m_locationMark.reset();
m_stackHandler.resetLocation();
@@ -337,6 +338,9 @@ public:
Utils::FileInProjectFinder m_fileFinder;
QByteArray m_qtNamespace;
+
+ // Safety net to avoid infinite lookups.
+ QSet<QByteArray> m_lookupRequests; // FIXME: Integrate properly.
};
@@ -2011,6 +2015,23 @@ bool DebuggerEngine::canHandleToolTip(const DebuggerToolTipContext &context) con
void DebuggerEngine::updateItem(const QByteArray &iname)
{
+ if (d->m_lookupRequests.contains(iname)) {
+ showMessage(QString::fromLatin1("IGNORING REPEATED REQUEST TO EXPAND " + iname));
+ WatchHandler *handler = watchHandler();
+ WatchItem *item = handler->findItem(iname);
+ if (!item->hasChildren()) {
+ handler->notifyUpdateStarted({iname});
+ item->setValue(decodeData({}, "notaccessible"));
+ item->setHasChildren(false);
+ item->outdated = false;
+ item->update();
+ handler->notifyUpdateFinished();
+ return;
+ }
+ // We could legitimately end up here after expanding + closing + re-expaning an item.
+ }
+ d->m_lookupRequests.insert(iname);
+
UpdateParameters params;
params.partialVariable = iname;
doUpdateLocals(params);