Skip to content

Commit dc6aac5

Browse files
authored
[Support] [lldb] Fix thread jump #45326 (#135778)
Fixes #45326 When you thread jump by calling `j +2` or `thread jump --by +2` the offset is not recognised. This commit fixes that. --------- Signed-off-by: Ebuka Ezike <[email protected]>
1 parent 88f61f2 commit dc6aac5

File tree

4 files changed

+92
-3
lines changed

4 files changed

+92
-3
lines changed

lldb/source/Commands/CommandObjectThread.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1649,11 +1649,14 @@ class CommandObjectThreadJump : public CommandObjectParsed {
16491649
return Status::FromErrorStringWithFormat("invalid line number: '%s'.",
16501650
option_arg.str().c_str());
16511651
break;
1652-
case 'b':
1652+
case 'b': {
1653+
option_arg.consume_front("+");
1654+
16531655
if (option_arg.getAsInteger(0, m_line_offset))
16541656
return Status::FromErrorStringWithFormat("invalid line offset: '%s'.",
16551657
option_arg.str().c_str());
16561658
break;
1659+
}
16571660
case 'a':
16581661
m_load_addr = OptionArgParser::ToAddress(execution_context, option_arg,
16591662
LLDB_INVALID_ADDRESS, &error);

lldb/source/Commands/Options.td

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1136,7 +1136,8 @@ let Command = "thread jump" in {
11361136
def thread_jump_line : Option<"line", "l">, Group<1>, Arg<"LineNum">,
11371137
Required, Desc<"Specifies the line number to jump to.">;
11381138
def thread_jump_by : Option<"by", "b">, Group<2>, Arg<"Offset">, Required,
1139-
Desc<"Jumps by a relative line offset from the current line.">;
1139+
Desc<"Jumps by a relative line offset from the current line,"
1140+
"can be a positive or negative offset">;
11401141
def thread_jump_address : Option<"address", "a">, Group<3>,
11411142
Arg<"AddressOrExpression">, Required, Desc<"Jumps to a specific address.">;
11421143
def thread_jump_force : Option<"force", "r">, Groups<[1,2,3]>,

lldb/test/API/functionalities/thread/jump/TestThreadJump.py

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,12 @@
1010

1111

1212
class ThreadJumpTestCase(TestBase):
13+
def setUp(self):
14+
TestBase.setUp(self)
15+
self.build()
16+
1317
def test(self):
1418
"""Test thread jump handling."""
15-
self.build()
1619
exe = self.getBuildArtifact("a.out")
1720
self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
1821

@@ -62,6 +65,71 @@ def test(self):
6265
substrs=["error"],
6366
)
6467

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+
65133
def do_min_test(self, start, jump, var, value):
66134
# jump to the start marker
67135
self.runCmd("j %i" % start)

lldb/test/API/functionalities/thread/jump/main.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,21 @@ T min(T a, T b)
1313
}
1414
}
1515

16+
int jump_positive_offset() {
17+
int var_1 = 10;
18+
var_1 = 20; // breakpoint 1
19+
20+
int var_2 = 40; // jump_offset 1
21+
return var_2;
22+
}
23+
24+
int jump_negative_offset() {
25+
int var_3 = 10; // jump_offset 2
26+
var_3 = 99;
27+
28+
return var_3; // breakpoint 2
29+
}
30+
1631
int main ()
1732
{
1833
int i;
@@ -22,5 +37,7 @@ int main ()
2237
i = min(min_i_a, min_i_b); // 3rd marker
2338
j = min(min_j_a, min_j_b); // 4th marker
2439

40+
jump_positive_offset();
41+
jump_negative_offset();
2542
return 0;
2643
}

0 commit comments

Comments
 (0)