https://github.com/felipepiovezan created 
https://github.com/llvm/llvm-project/pull/195815

See the discussion in https://github.com/llvm/llvm-project/pull/192971

When LLDB makes the decision to eagerly send a breakpoint packet, it should 
first ensure the delayed breakpoints are flushed, as they may interfere with 
the eager breakpoint that is about to be changed.

>From d160752126ce7c0fb621cecdc7cee0ae63355c7b Mon Sep 17 00:00:00 2001
From: Felipe de Azevedo Piovezan <[email protected]>
Date: Tue, 5 May 2026 10:35:22 +0100
Subject: [PATCH] [lldb] Flush delayed breakpoints before eagerly changing one

See the discussion in https://github.com/llvm/llvm-project/pull/192971

When LLDB makes the decision to eagerly send a breakpoint packet, it
should first ensure the delayed breakpoints are flushed, as they may
interfere with the eager breakpoint that is about to be changed.
---
 lldb/source/Target/Process.cpp                |  8 ++++++
 .../TestDelayedBreakpoint.py                  | 26 +++++++++++++++++++
 2 files changed, 34 insertions(+)

diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp
index 114bbd7355f0c..011617c2836c6 100644
--- a/lldb/source/Target/Process.cpp
+++ b/lldb/source/Target/Process.cpp
@@ -1763,6 +1763,14 @@ Process::CreateBreakpointSite(const BreakpointLocationSP 
&constituent,
       BreakpointResolver::ResolverTy::AddressResolver;
   bool should_be_eager = use_hardware || bp_from_address;
 
+  // If this breakpoint must be eager, flush the breakpoint queue in case there
+  // is an interaction between the sites in the queue and this new site.
+  if (should_be_eager)
+    if (auto E = FlushDelayedBreakpoints())
+      LLDB_LOG_ERROR(
+          GetLog(LLDBLog::Breakpoints), std::move(E),
+          "eager breakpoint requested, but failed to flush breakpoints: {0}");
+
   auto error = should_be_eager ? EnableBreakpointSite(bp_site_sp.get())
                                : Status::FromError(ExecuteBreakpointSiteAction(
                                      *bp_site_sp, BreakpointAction::Enable));
diff --git 
a/lldb/test/API/functionalities/breakpoint/delayed_breakpoints/TestDelayedBreakpoint.py
 
b/lldb/test/API/functionalities/breakpoint/delayed_breakpoints/TestDelayedBreakpoint.py
index 70a28bb935027..bd4619bfb663a 100644
--- 
a/lldb/test/API/functionalities/breakpoint/delayed_breakpoints/TestDelayedBreakpoint.py
+++ 
b/lldb/test/API/functionalities/breakpoint/delayed_breakpoints/TestDelayedBreakpoint.py
@@ -39,3 +39,29 @@ def test(self):
 
         log_after = log_text.split("AFTER_BPS", 1)[-1].split("AFTER_CONTINUE", 
1)[0]
         self.assertIn("send packet: $Z", log_after)
+
+    def test_eager_breakpoints(self):
+        self.build()
+        logfile = os.path.join(self.getBuildDir(), "log.txt")
+        self.runCmd(f"log enable -f {logfile} gdb-remote packets")
+
+        target, process, _, _ = lldbutil.run_to_source_breakpoint(
+            self, "main", lldb.SBFileSpec("main.c")
+        )
+
+        bp1 = target.BreakpointCreateByLocation("main.c", 1)
+        self.runCmd("proc plugin packet send BEGIN_EAGER", check=False)
+        # Create an address breakpoint to trigger eager breakpoints.
+        fake_address = 0x1234567
+        target.BreakpointCreateByAddress(fake_address)
+        self.runCmd("proc plugin packet send END_EAGER", check=False)
+
+        self.assertTrue(os.path.exists(logfile))
+        log = 
open(logfile).read().split("BEGIN_EAGER")[1].split("END_EAGER")[0]
+        breakpoint_lines = [line for line in log if "send packet: $Z" in line]
+        breakpoint_lines = "".join(breakpoint_lines)
+
+        bp_addresses = [f"{loc.GetLoadAddress():x}" for loc in bp1.locations]
+        bp_addresses += [f"{fake_address:x}"]
+        for addr in bp_addresses:
+            self.assertIn(addr, breakpoint_lines)

_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to