|
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