Debugger: Fix removing auto detected debuggers

Do not remove items while iterating over the tree
or we may crash when removing more than one.

Change-Id: I007672be94a7e6449cf25c965c07ca714049ae97
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Christian Stenger
2022-01-27 12:26:29 +01:00
parent 3869487a47
commit 5c1b4d2b48

View File

@@ -1053,19 +1053,23 @@ void DebuggerItemManager::removeDetectedDebuggers(const QString &detectionSource
QString *logMessage) QString *logMessage)
{ {
QStringList logMessages{tr("Removing debugger entries...")}; QStringList logMessages{tr("Removing debugger entries...")};
d->m_model->forItemsAtLevel<2>([detectionSource, &logMessages](DebuggerTreeItem *titem) { QList<DebuggerTreeItem *> toBeRemoved;
d->m_model->forItemsAtLevel<2>([detectionSource, &toBeRemoved](DebuggerTreeItem *titem) {
if (titem->m_item.detectionSource() == detectionSource) { if (titem->m_item.detectionSource() == detectionSource) {
logMessages.append(tr("Removed \"%1\"").arg(titem->m_item.displayName())); toBeRemoved.append(titem);
d->m_model->destroyItem(titem);
return; return;
} }
// FIXME: These items appeared in early docker development. Ok to remove for Creator 7.0. // FIXME: These items appeared in early docker development. Ok to remove for Creator 7.0.
FilePath filePath = titem->m_item.command(); FilePath filePath = titem->m_item.command();
if (filePath.scheme() + ':' + filePath.host() == detectionSource) { if (filePath.scheme() + ':' + filePath.host() == detectionSource)
logMessages.append(tr("Removed \"%1\"").arg(titem->m_item.displayName())); toBeRemoved.append(titem);
d->m_model->destroyItem(titem);
}
}); });
for (DebuggerTreeItem *current : toBeRemoved) {
logMessages.append(tr("Removed \"%1\"").arg(current->m_item.displayName()));
d->m_model->destroyItem(current);
}
if (logMessage) if (logMessage)
*logMessage = logMessages.join('\n'); *logMessage = logMessages.join('\n');
} }