summaryrefslogtreecommitdiff
path: root/lldb/test/API/macosx/thread_start_bps
diff options
context:
space:
mode:
authorFelipe de Azevedo Piovezan <fpiovezan@apple.com>2025-04-11 11:46:22 -0700
committerGitHub <noreply@github.com>2025-04-11 11:46:22 -0700
commitc2939b9bf672713ac36910a3e6d00c19ace1bd44 (patch)
tree9cf7bd68254491a63a4880c8f487a8bf24767660 /lldb/test/API/macosx/thread_start_bps
parent38e64b1a84d1af0bb232833f8f6f57bd4d6e8a7a (diff)
Reland "[lldb] Clear thread-creation breakpoints in ProcessGDBRemote::Clear (#134397)" (#135296)
This reapplies commit https://github.com/llvm/llvm-project/commit/232525f06942adb3b9977632e38dcd5f08c0642d. The original commit triggered a sanitizer failure when `Target` was destroyed. In `Target::Destroy`, `DeleteCurrentProcess` was called, but it did not destroy the thread creation breakpoints for the underlying `ProcessGDBRemote` because `ProcessGDBRemote::Clear` was not called in that path. `Target `then proceeded to destroy its breakpoints, which resulted in a call to the destructor of a `std::vector` containing the breakpoints. Through a sequence of complicated events, destroying breakpoints caused the reference count of the underlying `ProcessGDBRemote` to finally reach zero. This, in turn, called `ProcessGDBRemote::Clear`, which attempted to destroy the breakpoints. To do that, it would go back into the Target's vector of breakpoints, which we are in the middle of destroying. We solve this by moving the breakpoint deletion into `Process:DoDestroy`, which is a virtual Process method that will be called much earlier.
Diffstat (limited to 'lldb/test/API/macosx/thread_start_bps')
-rw-r--r--lldb/test/API/macosx/thread_start_bps/TestBreakpointsThreadInit.py20
1 files changed, 20 insertions, 0 deletions
diff --git a/lldb/test/API/macosx/thread_start_bps/TestBreakpointsThreadInit.py b/lldb/test/API/macosx/thread_start_bps/TestBreakpointsThreadInit.py
index 1c6fd4f91c73..bf667f6f7d33 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 @@ class TestInterruptThreadNames(TestBase):
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)