Files
clang-p2996/lldb/test/API/macosx/thread_start_bps/TestBreakpointsThreadInit.py
Felipe de Azevedo Piovezan c2939b9bf6 Reland "[lldb] Clear thread-creation breakpoints in ProcessGDBRemote::Clear (#134397)" (#135296)
This reapplies commit
232525f069.

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.
2025-04-11 11:46:22 -07:00

58 lines
1.7 KiB
Python

"""Test that we get thread names when interrupting a process."""
import time
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class TestInterruptThreadNames(TestBase):
@skipUnlessDarwin
def test_internal_bps_resolved(self):
self.build()
source_file = lldb.SBFileSpec("main.c")
target, process, thread, bkpt = lldbutil.run_to_source_breakpoint(
self, "initial hello", source_file
)
thread_start_func_names = [
"start_wqthread",
"_pthread_wqthread",
"_pthread_start",
]
known_module_names = [
"libsystem_c.dylib",
"libSystem.B.dylib",
"libsystem_pthread.dylib",
]
bps = []
for func in thread_start_func_names:
for module in known_module_names:
bps.append(target.BreakpointCreateByName(func, module))
num_resolved = 0
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)