From a04270528f82b51ab5f558e0689b54070e8cd361 Mon Sep 17 00:00:00 2001 From: Felipe de Azevedo Piovezan Date: Fri, 4 Apr 2025 10:05:44 -0700 Subject: [PATCH] [lldb] Clear thread-creation breakpoints in ProcessGDBRemote::Clear (#134397) Currently, these breakpoints are being accumulated every time a new process if created (e.g. through a `run`). Depending on the circumstances, the old breakpoints are even left enabled, interfering with subsequent processes. This is addressed by removing the breakpoints in ProcessGDBRemote::Clear Note that these breakpoints are more of a PlatformDarwin thing, so in the future we should look into moving them there. (cherry picked from commit 232525f06942adb3b9977632e38dcd5f08c0642d) (cherry picked from commit 8afffeb3435e36a854fecd6342552f96cd4424d4) --- .../Process/gdb-remote/ProcessGDBRemote.cpp | 3 +++ .../TestBreakpointsThreadInit.py | 20 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp index ba0384be51c70..0b2cc4f0f3328 100644 --- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp @@ -3315,6 +3315,9 @@ Status ProcessGDBRemote::DisableWatchpoint(WatchpointSP wp_sp, bool notify) { void ProcessGDBRemote::Clear() { m_thread_list_real.Clear(); m_thread_list.Clear(); + if (m_thread_create_bp_sp) + if (TargetSP target_sp = m_target_wp.lock()) + target_sp->RemoveBreakpointByID(m_thread_create_bp_sp->GetID()); } Status ProcessGDBRemote::DoSignal(int signo) { diff --git a/lldb/test/API/macosx/thread_start_bps/TestBreakpointsThreadInit.py b/lldb/test/API/macosx/thread_start_bps/TestBreakpointsThreadInit.py index 1c6fd4f91c73e..bf667f6f7d336 100644 --- a/lldb/test/API/macosx/thread_start_bps/TestBreakpointsThreadInit.py +++ b/lldb/test/API/macosx/thread_start_bps/TestBreakpointsThreadInit.py @@ -35,3 +35,23 @@ def test_internal_bps_resolved(self): for bp in bps: num_resolved += bp.GetNumResolvedLocations() self.assertGreater(num_resolved, 0) + + @skipUnlessDarwin + def test_internal_bps_deleted_on_relaunch(self): + self.build() + + source_file = lldb.SBFileSpec("main.c") + target, process, thread, bkpt = lldbutil.run_to_source_breakpoint( + self, "initial hello", source_file + ) + + self.runCmd("break list --internal") + output = self.res.GetOutput() + self.assertEqual(output.count("thread-creation"), 1) + + process.Kill() + self.runCmd("run", RUN_SUCCEEDED) + + self.runCmd("break list --internal") + output = self.res.GetOutput() + self.assertEqual(output.count("thread-creation"), 1)