import lldb from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil class AlwaysRunThreadNamesTestCase(TestBase): NO_DEBUG_INFO_TESTCASE = True @skipIfWindows def test_always_run_thread_resumes_during_step(self): """Test that a thread named in always-run-thread-names continues running when another thread single-steps.""" self.build() (target, _, thread, _) = lldbutil.run_to_source_breakpoint( self, "// break here", lldb.SBFileSpec("main.cpp") ) # Configure the setting to keep our helper thread running. self.runCmd("settings set target.process.always-run-thread-names always-run") # Tell step_over_me() to block until the helper thread advances. self.runCmd("expression g_sync_with_helper = true") # Record the helper thread's counter before stepping. counter_before = target.FindFirstGlobalVariable("g_helper_count") self.assertTrue(counter_before.IsValid()) val_before = counter_before.GetValueAsUnsigned() # The step over normally suspends all other threads, but the # always-run-thread-names setting keeps the helper thread running. # Because g_sync_with_helper is true, step_over_me() will spin until # the helper thread increments the counter. thread.StepOver(lldb.eOnlyThisThread) self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonPlanComplete) counter_after = target.FindFirstGlobalVariable("g_helper_count") val_after = counter_after.GetValueAsUnsigned() self.assertGreater( val_after, val_before, "Helper thread counter did not advance during step-over " "(expected it to run because of always-run-thread-names).", ) @skipIfWindows def test_without_setting_thread_is_suspended(self): """Test that without the setting, the helper thread is suspended during single-stepping (baseline).""" self.build() (target, _, thread, _) = lldbutil.run_to_source_breakpoint( self, "// break here", lldb.SBFileSpec("main.cpp") ) # Do NOT set always-run-thread-names. counter_before = target.FindFirstGlobalVariable("g_helper_count") self.assertTrue(counter_before.IsValid()) val_before = counter_before.GetValueAsUnsigned() # Step over with only-this-thread mode. thread.StepOver(lldb.eOnlyThisThread) self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonPlanComplete) # The helper thread should have been suspended, so its counter should # not have changed. counter_after = target.FindFirstGlobalVariable("g_helper_count") val_after = counter_after.GetValueAsUnsigned() self.assertEqual( val_after, val_before, "Helper thread counter advanced during step-over " "(expected it to be suspended without always-run-thread-names).", )