From c061dfad962edaae3226e48e138eb10ed66484ab Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 17 Dec 2024 10:05:15 +0100 Subject: [PATCH] Debugger/BreakHandler: Add some guards when removing breakpoints We've got a crash report when accessing the engine in that area, so the question is if an engine can get deleted while the loop is running. Add an explicit check. Also check for the precondition that each BreakpointItem only belongs to a single engine. Change-Id: I97b35aa6dedeb6b3cae956f549ea5fb77c61a00d Reviewed-by: hjk --- src/plugins/debugger/breakhandler.cpp | 11 +++++++++-- src/plugins/debugger/enginemanager.cpp | 4 ++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp index 2636e99b256..acd12025a91 100644 --- a/src/plugins/debugger/breakhandler.cpp +++ b/src/plugins/debugger/breakhandler.cpp @@ -1521,8 +1521,15 @@ void BreakpointItem::deleteBreakpoint() { QTC_ASSERT(!globalBreakpoint(), return); // Use deleteBreakpoint(GlobalBreakpoint gbp) instead. - for (QPointer engine : EngineManager::engines()) - engine->breakHandler()->requestBreakpointRemoval(this); + bool found = false; + for (QPointer engine : EngineManager::engines()) { + if (QTC_GUARD(engine)) { + QTC_CHECK(!found); + found = true; + engine->breakHandler()->requestBreakpointRemoval(this); + } + } + QTC_CHECK(found); } void BreakpointItem::deleteGlobalOrThisBreakpoint() diff --git a/src/plugins/debugger/enginemanager.cpp b/src/plugins/debugger/enginemanager.cpp index a0f515897c4..905bdfbe290 100644 --- a/src/plugins/debugger/enginemanager.cpp +++ b/src/plugins/debugger/enginemanager.cpp @@ -616,8 +616,8 @@ QList> EngineManager::engines() { QList> result; d->m_engineModel.forItemsAtLevel<1>([&result](EngineItem *engineItem) { - if (DebuggerEngine *engine = engineItem->m_engine) - result.append(engine); + if (engineItem->m_engine) + result.append(engineItem->m_engine); }); return result; }