"""
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)