Make sure deleting all breakpoints clears their sites first
authorEugene Zemtsov <ezemtsov@google.com>
Mon, 16 Apr 2018 22:26:21 +0000 (22:26 +0000)
committerEugene Zemtsov <ezemtsov@google.com>
Mon, 16 Apr 2018 22:26:21 +0000 (22:26 +0000)
Bug: https://bugs.llvm.org/show_bug.cgi?id=36430

Differential Revision: https://reviews.llvm.org/D45554

llvm-svn: 330163

lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_command/TestBreakpointCommand.py
lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_command/main.c
lldb/source/Breakpoint/BreakpointList.cpp

index 8b56e6f9d27ad112e72fadc84c959599c929b963..7a2dc61b1b6901c49a5aa5d9e83267fc6c9e3951 100644 (file)
@@ -45,6 +45,25 @@ class BreakpointCommandTestCase(TestBase):
         self.addTearDownHook(
             lambda: self.runCmd("settings clear auto-confirm"))
 
+    @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24528")
+    def test_delete_all_breakpoints(self):
+        """Test that deleting all breakpoints works."""
+        self.build()
+        exe = self.getBuildArtifact("a.out")
+        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+        lldbutil.run_break_set_by_symbol(self, "main")
+        lldbutil.run_break_set_by_file_and_line(
+            self, "main.c", self.line, num_expected_locations=1, loc_exact=True)
+
+        self.runCmd("run", RUN_SUCCEEDED)
+
+        self.runCmd("breakpoint delete")
+        self.runCmd("process continue")
+        self.expect("process status", PROCESS_STOPPED,
+                    patterns=['Process .* exited with status = 0'])
+
+
     def breakpoint_command_sequence(self):
         """Test a sequence of breakpoint command add, list, and delete."""
         exe = self.getBuildArtifact("a.out")
index 62ec97f43284b7a204f654e08513bf66b49a6b23..702644b692d8254af79c0d9d6acfca7b5f751933 100644 (file)
@@ -9,5 +9,9 @@
 
 int main (int argc, char const *argv[])
 {
+    // Add a body to the function, so we can set more than one
+    // breakpoint in it.
+    static volatile int var = 0;
+    var++;
     return 0; // Set break point at this line.
 }
index 01ac59f0a903ec406976c2e23d072298dcc2322a..4a49b1e105ab532faa5bb61d7723cd42b24d7bd6 100644 (file)
@@ -99,7 +99,7 @@ void BreakpointList::RemoveAll(bool notify) {
 
 void BreakpointList::RemoveAllowed(bool notify) {
   std::lock_guard<std::recursive_mutex> guard(m_mutex);
-  
+
   bp_collection::iterator pos, end = m_breakpoints.end();
   if (notify) {
     for (pos = m_breakpoints.begin(); pos != end; ++pos) {
@@ -116,10 +116,12 @@ void BreakpointList::RemoveAllowed(bool notify) {
   }
   pos = m_breakpoints.begin();
   while ( pos != end) {
-      if((*pos)->AllowDelete())
-        pos = m_breakpoints.erase(pos);
-      else
-        pos++;
+    auto bp = *pos;
+    if (bp->AllowDelete()) {
+      bp->ClearAllBreakpointSites();
+      pos = m_breakpoints.erase(pos);
+    } else
+      pos++;
   }
 }