171 lines · python
1"""2Test number of threads.3"""4 5 6import lldb7from lldbsuite.test.decorators import *8from lldbsuite.test.lldbtest import *9from lldbsuite.test import lldbutil10 11 12class CreateDuringStepTestCase(TestBase):13 @expectedFailureAll(14 oslist=["linux"],15 bugnumber="llvm.org/pr15824 thread states not properly maintained",16 )17 @expectedFailureAll(18 oslist=lldbplatformutil.getDarwinOSTriples(),19 bugnumber="llvm.org/pr15824 thread states not properly maintained, <rdar://problem/28557237>",20 )21 @expectedFailureAll(22 oslist=["freebsd"],23 bugnumber="llvm.org/pr18190 thread states not properly maintained",24 )25 @expectedFailureAll(26 oslist=["windows"],27 bugnumber="llvm.org/pr24668: Breakpoints not resolved correctly",28 )29 @expectedFailureNetBSD30 def test_step_inst(self):31 """Test thread creation during step-inst handling."""32 self.build()33 self.create_during_step_base(34 "thread step-inst -m all-threads", "stop reason = instruction step"35 )36 37 @expectedFailureAll(38 oslist=["linux"],39 bugnumber="llvm.org/pr15824 thread states not properly maintained",40 )41 @expectedFailureAll(42 oslist=lldbplatformutil.getDarwinOSTriples(),43 bugnumber="llvm.org/pr15824 thread states not properly maintained, <rdar://problem/28557237>",44 )45 @expectedFailureAll(46 oslist=["freebsd"],47 bugnumber="llvm.org/pr18190 thread states not properly maintained",48 )49 @expectedFailureAll(50 oslist=["windows"],51 bugnumber="llvm.org/pr24668: Breakpoints not resolved correctly",52 )53 @expectedFailureNetBSD54 def test_step_over(self):55 """Test thread creation during step-over handling."""56 self.build()57 self.create_during_step_base(58 "thread step-over -m all-threads", "stop reason = step over"59 )60 61 @expectedFailureAll(62 oslist=["linux"],63 bugnumber="llvm.org/pr15824 thread states not properly maintained",64 )65 @expectedFailureAll(66 oslist=lldbplatformutil.getDarwinOSTriples(),67 bugnumber="<rdar://problem/28574077>",68 )69 @expectedFailureAll(70 oslist=["freebsd"],71 bugnumber="llvm.org/pr18190 thread states not properly maintained",72 )73 @expectedFailureAll(74 oslist=["windows"],75 bugnumber="llvm.org/pr24668: Breakpoints not resolved correctly",76 )77 @expectedFailureNetBSD78 def test_step_in(self):79 """Test thread creation during step-in handling."""80 self.build()81 self.create_during_step_base(82 "thread step-in -m all-threads", "stop reason = step in"83 )84 85 def setUp(self):86 # Call super's setUp().87 TestBase.setUp(self)88 # Find the line numbers to break and continue.89 self.breakpoint = line_number("main.cpp", "// Set breakpoint here")90 self.continuepoint = line_number("main.cpp", "// Continue from here")91 92 def create_during_step_base(self, step_cmd, step_stop_reason):93 """Test thread creation while using step-in."""94 exe = self.getBuildArtifact("a.out")95 self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)96 97 # Get the target process98 target = self.dbg.GetSelectedTarget()99 100 # This should create a breakpoint in the stepping thread.101 self.bkpt = target.BreakpointCreateByLocation("main.cpp", self.breakpoint)102 103 # Run the program.104 self.runCmd("run", RUN_SUCCEEDED)105 106 process = target.GetProcess()107 108 # The stop reason of the thread should be breakpoint.109 stepping_thread = lldbutil.get_one_thread_stopped_at_breakpoint(110 process, self.bkpt111 )112 self.assertTrue(stepping_thread.IsValid(), "We stopped at the right breakpoint")113 114 # Get the number of threads115 num_threads = process.GetNumThreads()116 117 # Make sure we see only two threads118 self.assertEqual(119 num_threads,120 2,121 "Number of expected threads and actual threads do not match.",122 )123 124 # Get the thread objects125 thread1 = process.GetThreadAtIndex(0)126 thread2 = process.GetThreadAtIndex(1)127 128 current_line = self.breakpoint129 # Keep stepping until we've reached our designated continue point130 while current_line != self.continuepoint:131 if stepping_thread != process.GetSelectedThread():132 process.SetSelectedThread(stepping_thread)133 134 self.runCmd(step_cmd)135 136 frame = stepping_thread.GetFrameAtIndex(0)137 current_line = frame.GetLineEntry().GetLine()138 139 # Make sure we're still where we thought we were140 self.assertGreaterEqual(141 current_line,142 self.breakpoint,143 "Stepped to unexpected line, " + str(current_line),144 )145 self.assertLessEqual(146 current_line,147 self.continuepoint,148 "Stepped to unexpected line, " + str(current_line),149 )150 151 # Update the number of threads152 num_threads = process.GetNumThreads()153 154 # Check to see that we increased the number of threads as expected155 self.assertEqual(156 num_threads,157 3,158 "Number of expected threads and actual threads do not match after thread exit.",159 )160 161 stop_reason = stepping_thread.GetStopReason()162 self.assertStopReason(163 stop_reason, lldb.eStopReasonPlanComplete, "Stopped for plan completion"164 )165 166 # Run to completion167 self.runCmd("process continue")168 169 # At this point, the inferior process should have exited.170 self.assertEqual(process.GetState(), lldb.eStateExited, PROCESS_EXITED)171