Fix MI/GDB breakpoints delete logic.
authorMikhail Kurinnoi <m.kurinnoi@samsung.com>
Fri, 14 Aug 2020 14:43:08 +0000 (17:43 +0300)
committerAlexander Soldatov/Platform Lab /SRR/Staff Engineer/Samsung Electronics <soldatov.a@samsung.com>
Fri, 21 Aug 2020 09:22:15 +0000 (12:22 +0300)
src/debug/netcoredbg/miprotocol.cpp

index 4785484f7364b23b86c2dad6d3f56ba138c2b10c..eb8597de860c5f8c7135314a01894eb189c7e63f 100644 (file)
@@ -639,13 +639,20 @@ void MIProtocol::DeleteBreakpoints(const std::unordered_set<uint32_t> &ids)
 {
     for (auto &breakpointsIter : m_breakpoints)
     {
+        std::size_t initialSize = breakpointsIter.second.size();
         std::vector<SourceBreakpoint> remainingBreakpoints;
-        for (auto it : breakpointsIter.second)
+        for (auto it = breakpointsIter.second.begin(); it != breakpointsIter.second.end();)
         {
-            if (ids.find(it.first) == ids.end())
-                remainingBreakpoints.push_back(it.second);
+            if (ids.find(it->first) == ids.end())
+            {
+                remainingBreakpoints.push_back(it->second);
+                ++it;
+            }
+            else
+                it = breakpointsIter.second.erase(it);
         }
-        if (remainingBreakpoints.size() == breakpointsIter.second.size())
+
+        if (initialSize == breakpointsIter.second.size())
             continue;
 
         std::string filename = breakpointsIter.first;
@@ -657,14 +664,20 @@ void MIProtocol::DeleteBreakpoints(const std::unordered_set<uint32_t> &ids)
 
 void MIProtocol::DeleteFunctionBreakpoints(const std::unordered_set<uint32_t> &ids)
 {
+    std::size_t initialSize = m_funcBreakpoints.size();
     std::vector<FunctionBreakpoint> remainingFuncBreakpoints;
-    for (auto &fb : m_funcBreakpoints)
+    for (auto it = m_funcBreakpoints.begin(); it != m_funcBreakpoints.end();)
     {
-        if (ids.find(fb.first) == ids.end())
-            remainingFuncBreakpoints.push_back(fb.second);
+        if (ids.find(it->first) == ids.end())
+        {
+            remainingFuncBreakpoints.push_back(it->second);
+            ++it;
+        }
+        else
+            it = m_funcBreakpoints.erase(it);
     }
 
-    if (remainingFuncBreakpoints.size() == m_funcBreakpoints.size())
+    if (initialSize == m_funcBreakpoints.size())
         return;
 
     std::vector<Breakpoint> tmpBreakpoints;