""" Test that suspended threads do not affect should-stop decisions. """ import lldb from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * import lldbsuite.test.lldbutil as lldbutil class IgnoreSuspendedThreadTestCase(TestBase): NO_DEBUG_INFO_TESTCASE = True def setUp(self): #Call super's setUp(). TestBase.setUp(self) #Find the line numbers for our breakpoints. self.break_1 = line_number('main.cpp', '// Set first breakpoint here') self.break_2 = line_number('main.cpp', '// Set second breakpoint here') self.break_3 = line_number('main.cpp', '// Set third breakpoint here') def printThreadsStoppedByBreakpoint(self, process): stopped_threads = \ lldbutil.get_stopped_threads(process, lldb.eStopReasonBreakpoint) for thread in stopped_threads: break_id = thread.GetStopReasonDataAtIndex(0) print('Thread ' + str(thread.GetThreadID()) + \ ' stopped at breakpoint ' + str(break_id)) def test(self): self.build() target = lldbutil.run_to_breakpoint_make_target(self) #This should create a breakpoint with 1 location. bp1_id = \ lldbutil.run_break_set_by_file_and_line(self, "main.cpp", self.break_1, num_expected_locations=1) bp2_id = \ lldbutil.run_break_set_by_file_and_line(self, "main.cpp", self.break_2, num_expected_locations=1) bp3_id = \ lldbutil.run_break_set_by_file_and_line(self, "main.cpp", self.break_3, num_expected_locations=1) #Run the program. self.runCmd("run", RUN_SUCCEEDED) #Get the target process process = target.GetProcess() if self.TraceOn(): print('First stop:') self.printThreadsStoppedByBreakpoint(process) thread_to_suspend = \ lldbutil.get_one_thread_stopped_at_breakpoint_id(process, bp1_id) self.assertIsNotNone(thread_to_suspend, "Should hit breakpoint 1") thread_to_suspend.Suspend() #Do not stop at bp2 and autocontinue to bp3 target.FindBreakpointByID(bp2_id).SetAutoContinue(True) #Run to the third breakpoint self.runCmd("continue") if self.TraceOn(): print('Second stop:') self.printThreadsStoppedByBreakpoint(process) stopped_thread = \ lldbutil.get_one_thread_stopped_at_breakpoint_id(process, bp3_id) self.assertIsNotNone(stopped_thread, "Should hit breakpoint 3") thread_to_suspend.Resume() #Run to completion self.runCmd("continue") #At this point, the inferior process should have exited. self.assertEqual(process.GetState(), lldb.eStateExited, PROCESS_EXITED)