brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.0 KiB · 3ad4a09 Raw
82 lines · python
1"""2Test "print object" where another thread blocks the print object from making progress.3"""4 5import lldb6from lldbsuite.test.decorators import *7from lldbsuite.test.lldbtest import *8from lldbsuite.test import lldbutil9 10 11class PrintObjTestCase(TestBase):12    def setUp(self):13        # Call super's setUp().14        TestBase.setUp(self)15        # My source program.16        self.source = "blocked.m"17        # Find the line numbers to break at.18        self.line = line_number(self.source, "// Set a breakpoint here.")19 20    def test_print_obj(self):21        """22        Test "print object" where another thread blocks the print object from making progress.23 24        Set a breakpoint on the line in my_pthread_routine.  Then switch threads25        to the main thread, and do print the lock_me object.  Since that will26        try to get the lock already gotten by my_pthread_routime thread, it will27        have to switch to running all threads, and that should then succeed.28        """29        d = {"EXE": "b.out"}30        self.build(dictionary=d)31        self.setTearDownCleanup(dictionary=d)32        exe = self.getBuildArtifact("b.out")33 34        target = self.dbg.CreateTarget(exe)35        self.assertTrue(target, VALID_TARGET)36 37        breakpoint = target.BreakpointCreateByLocation(self.source, self.line)38        self.assertTrue(breakpoint, VALID_BREAKPOINT)39        self.runCmd("breakpoint list")40 41        # Launch the process, and do not stop at the entry point.42        process = target.LaunchSimple(None, None, self.get_process_working_directory())43 44        self.runCmd("thread backtrace all")45 46        # Let's get the current stopped thread.  We'd like to switch to the47        # other thread to issue our 'po lock_me' command.48        import lldbsuite.test.lldbutil as lldbutil49 50        this_thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint)51        self.assertTrue(this_thread)52 53        # Find the other thread.  The iteration protocol of SBProcess and the54        # rich comparison methods (__eq__/__ne__) of SBThread come in handy.55        other_thread = None56        for t in process:57            if t != this_thread:58                other_thread = t59                break60 61        # Set the other thread as the selected thread to issue our 'po'62        # command.other63        self.assertTrue(other_thread)64        process.SetSelectedThread(other_thread)65        if self.TraceOn():66            print("selected thread:" + lldbutil.get_description(other_thread))67        self.runCmd("thread backtrace")68 69        # We want to traverse the frame to the one corresponding to blocked.m to70        # issue our 'po lock_me' command.71 72        for frame in other_thread.frames:73            if frame.name == "main":74                other_thread.selected_frame = frame75                if self.TraceOn():76                    print("selected frame:" + lldbutil.get_description(frame))77                break78 79        self.expect(80            "po lock_me", OBJECT_PRINTED_CORRECTLY, substrs=["I am pretty special."]81        )82