brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.7 KiB · 44851ed Raw
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