| 
10 | 10 | 
 
  | 
11 | 11 | 
 
  | 
12 | 12 | class ThreadJumpTestCase(TestBase):  | 
 | 13 | +    def setUp(self):  | 
 | 14 | +        TestBase.setUp(self)  | 
 | 15 | +        self.build()  | 
 | 16 | + | 
13 | 17 |     def test(self):  | 
14 | 18 |         """Test thread jump handling."""  | 
15 |  | -        self.build()  | 
16 | 19 |         exe = self.getBuildArtifact("a.out")  | 
17 | 20 |         self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)  | 
18 | 21 | 
 
  | 
@@ -62,6 +65,71 @@ def test(self):  | 
62 | 65 |             substrs=["error"],  | 
63 | 66 |         )  | 
64 | 67 | 
 
  | 
 | 68 | +    def test_jump_offset(self):  | 
 | 69 | +        """Test Thread Jump by negative or positive offset"""  | 
 | 70 | +        exe = self.getBuildArtifact("a.out")  | 
 | 71 | +        file_name = "main.cpp"  | 
 | 72 | +        self.runCmd(f"target create {exe}", CURRENT_EXECUTABLE_SET)  | 
 | 73 | + | 
 | 74 | +        pos_jump = line_number(file_name, "// jump_offset 1")  | 
 | 75 | +        neg_jump = line_number(file_name, "// jump_offset 2")  | 
 | 76 | +        pos_breakpoint = line_number(file_name, "// breakpoint 1")  | 
 | 77 | +        neg_breakpoint = line_number(file_name, "// breakpoint 2")  | 
 | 78 | +        pos_jump_offset = pos_jump - pos_breakpoint  | 
 | 79 | +        neg_jump_offset = neg_jump - neg_breakpoint  | 
 | 80 | + | 
 | 81 | +        var_1, var_1_value = ("var_1", "10")  | 
 | 82 | +        var_2, var_2_value = ("var_2", "40")  | 
 | 83 | +        var_3, var_3_value = ("var_3", "10")  | 
 | 84 | + | 
 | 85 | +        # create pos_breakpoint and neg_breakpoint  | 
 | 86 | +        lldbutil.run_break_set_by_file_and_line(  | 
 | 87 | +            self, file_name, pos_breakpoint, num_expected_locations=1  | 
 | 88 | +        )  | 
 | 89 | +        lldbutil.run_break_set_by_file_and_line(  | 
 | 90 | +            self, file_name, neg_breakpoint, num_expected_locations=1  | 
 | 91 | +        )  | 
 | 92 | + | 
 | 93 | +        self.runCmd("run", RUN_SUCCEEDED)  | 
 | 94 | + | 
 | 95 | +        # test positive jump  | 
 | 96 | +        # The stop reason of the thread should be breakpoint 1.  | 
 | 97 | +        self.expect(  | 
 | 98 | +            "thread list",  | 
 | 99 | +            STOPPED_DUE_TO_BREAKPOINT + " 1",  | 
 | 100 | +            substrs=[  | 
 | 101 | +                "stopped",  | 
 | 102 | +                f"{file_name}:{pos_breakpoint}",  | 
 | 103 | +                "stop reason = breakpoint 1",  | 
 | 104 | +            ],  | 
 | 105 | +        )  | 
 | 106 | + | 
 | 107 | +        self.runCmd(f"thread jump --by +{pos_jump_offset}")  | 
 | 108 | +        self.expect("process status", substrs=[f"at {file_name}:{pos_jump}"])  | 
 | 109 | +        self.expect(f"print {var_1}", substrs=[var_1_value])  | 
 | 110 | + | 
 | 111 | +        self.runCmd("thread step-over")  | 
 | 112 | +        self.expect(f"print {var_2}", substrs=[var_2_value])  | 
 | 113 | + | 
 | 114 | +        self.runCmd("continue")  | 
 | 115 | + | 
 | 116 | +        # test negative jump  | 
 | 117 | +        # The stop reason of the thread should be breakpoint 1.  | 
 | 118 | +        self.expect(  | 
 | 119 | +            "thread list",  | 
 | 120 | +            STOPPED_DUE_TO_BREAKPOINT + " 2",  | 
 | 121 | +            substrs=[  | 
 | 122 | +                "stopped",  | 
 | 123 | +                f"{file_name}:{neg_breakpoint}",  | 
 | 124 | +                "stop reason = breakpoint 2",  | 
 | 125 | +            ],  | 
 | 126 | +        )  | 
 | 127 | + | 
 | 128 | +        self.runCmd(f"thread jump --by {neg_jump_offset}")  | 
 | 129 | +        self.expect("process status", substrs=[f"at {file_name}:{neg_jump}"])  | 
 | 130 | +        self.runCmd("thread step-over")  | 
 | 131 | +        self.expect(f"print {var_3}", substrs=[var_3_value])  | 
 | 132 | + | 
65 | 133 |     def do_min_test(self, start, jump, var, value):  | 
66 | 134 |         # jump to the start marker  | 
67 | 135 |         self.runCmd("j %i" % start)  | 
 | 
0 commit comments