Fix breakpoint thread name conditionals after breakpoint options refactor.
PR36435 llvm-svn: 325958
This commit is contained in:
parent
16b20245ba
commit
e8b072d9e4
|
@ -13,68 +13,57 @@ from lldbsuite.test.decorators import *
|
|||
from lldbsuite.test.lldbtest import *
|
||||
from lldbsuite.test import lldbutil
|
||||
|
||||
def set_thread_id(thread, breakpoint):
|
||||
id = thread.id
|
||||
breakpoint.SetThreadID(id)
|
||||
|
||||
def set_thread_name(thread, breakpoint):
|
||||
breakpoint.SetThreadName("main-thread")
|
||||
|
||||
class ThreadSpecificBreakTestCase(TestBase):
|
||||
|
||||
mydir = TestBase.compute_mydir(__file__)
|
||||
NO_DEBUG_INFO_TESTCASE = True
|
||||
|
||||
@add_test_categories(['pyapi'])
|
||||
|
||||
@expectedFailureAll(oslist=["windows"])
|
||||
@expectedFailureAll(oslist=['ios', 'watchos', 'tvos', 'bridgeos'], archs=['armv7', 'armv7k'], bugnumber='rdar://problem/34563920') # armv7 ios problem - breakpoint with tid qualifier isn't working
|
||||
def test_python(self):
|
||||
def test_thread_id(self):
|
||||
self.do_test(set_thread_id)
|
||||
|
||||
@skipUnlessDarwin
|
||||
@expectedFailureAll(oslist=['ios', 'watchos', 'tvos', 'bridgeos'], archs=['armv7', 'armv7k'], bugnumber='rdar://problem/34563920') # armv7 ios problem - breakpoint with tid qualifier isn't working
|
||||
def test_thread_name(self):
|
||||
self.do_test(set_thread_name)
|
||||
|
||||
def do_test(self, setter_method):
|
||||
"""Test that we obey thread conditioned breakpoints."""
|
||||
self.build()
|
||||
exe = self.getBuildArtifact("a.out")
|
||||
main_source_spec = lldb.SBFileSpec("main.cpp")
|
||||
(target, process, main_thread, main_breakpoint) = lldbutil.run_to_source_breakpoint(self,
|
||||
"Set main breakpoint here", main_source_spec)
|
||||
|
||||
target = self.dbg.CreateTarget(exe)
|
||||
self.assertTrue(target, VALID_TARGET)
|
||||
main_thread_id = main_thread.GetThreadID()
|
||||
|
||||
# This test works by setting a breakpoint in a function conditioned to stop only on
|
||||
# the main thread, and then calling this function on a secondary thread, joining,
|
||||
# and then calling again on the main thread. If the thread specific breakpoint works
|
||||
# then it should not be hit on the secondary thread, only on the main
|
||||
# thread.
|
||||
|
||||
main_source_spec = lldb.SBFileSpec("main.cpp")
|
||||
|
||||
main_breakpoint = target.BreakpointCreateBySourceRegex(
|
||||
"Set main breakpoint here", main_source_spec)
|
||||
thread_breakpoint = target.BreakpointCreateBySourceRegex(
|
||||
"Set thread-specific breakpoint here", main_source_spec)
|
||||
|
||||
self.assertTrue(
|
||||
main_breakpoint.IsValid(),
|
||||
"Failed to set main breakpoint.")
|
||||
self.assertGreater(
|
||||
main_breakpoint.GetNumLocations(),
|
||||
0,
|
||||
"main breakpoint has no locations associated with it.")
|
||||
self.assertTrue(
|
||||
thread_breakpoint.IsValid(),
|
||||
"Failed to set thread breakpoint.")
|
||||
self.assertGreater(
|
||||
thread_breakpoint.GetNumLocations(),
|
||||
0,
|
||||
"thread breakpoint has no locations associated with it.")
|
||||
|
||||
process = target.LaunchSimple(
|
||||
None, None, self.get_process_working_directory())
|
||||
|
||||
self.assertTrue(process, PROCESS_IS_VALID)
|
||||
|
||||
stopped_threads = lldbutil.get_threads_stopped_at_breakpoint(
|
||||
process, main_breakpoint)
|
||||
self.assertEqual(
|
||||
len(stopped_threads),
|
||||
1,
|
||||
"main breakpoint stopped at unexpected number of threads")
|
||||
main_thread = stopped_threads[0]
|
||||
main_thread_id = main_thread.GetThreadID()
|
||||
|
||||
# Set the thread-specific breakpoint to only stop on the main thread. The run the function
|
||||
# on another thread and join on it. If the thread-specific breakpoint works, the next
|
||||
# stop should be on the main thread.
|
||||
thread_breakpoint.SetThreadID(main_thread_id)
|
||||
|
||||
main_thread_id = main_thread.GetThreadID()
|
||||
setter_method(main_thread, thread_breakpoint)
|
||||
|
||||
process.Continue()
|
||||
next_stop_state = process.GetState()
|
||||
|
|
|
@ -12,6 +12,11 @@ int
|
|||
main ()
|
||||
{
|
||||
// Set main breakpoint here.
|
||||
|
||||
#ifdef __APPLE__
|
||||
pthread_setname_np("main-thread");
|
||||
#endif
|
||||
|
||||
std::thread t(thread_function);
|
||||
t.join();
|
||||
|
||||
|
|
|
@ -470,12 +470,18 @@ const Baton *BreakpointOptions::GetBaton() const {
|
|||
bool BreakpointOptions::InvokeCallback(StoppointCallbackContext *context,
|
||||
lldb::user_id_t break_id,
|
||||
lldb::user_id_t break_loc_id) {
|
||||
if (m_callback && context->is_synchronous == IsCallbackSynchronous()) {
|
||||
return m_callback(m_callback_baton_sp ? m_callback_baton_sp->data()
|
||||
if (m_callback) {
|
||||
if (context->is_synchronous == IsCallbackSynchronous()) {
|
||||
return m_callback(m_callback_baton_sp ? m_callback_baton_sp->data()
|
||||
: nullptr,
|
||||
context, break_id, break_loc_id);
|
||||
} else
|
||||
return true;
|
||||
} else if (IsCallbackSynchronous()) {
|
||||
// If a synchronous callback is called at async time, it should not say
|
||||
// to stop.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool BreakpointOptions::HasCallback() const {
|
||||
|
@ -526,7 +532,10 @@ const ThreadSpec *BreakpointOptions::GetThreadSpecNoCreate() const {
|
|||
|
||||
ThreadSpec *BreakpointOptions::GetThreadSpec() {
|
||||
if (m_thread_spec_ap.get() == nullptr)
|
||||
{
|
||||
m_set_flags.Set(eThreadSpec);
|
||||
m_thread_spec_ap.reset(new ThreadSpec());
|
||||
}
|
||||
|
||||
return m_thread_spec_ap.get();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue