[lldb] Make step/s alias for new _regexp-step (#153984)

Introduces `_regexp-step`, a step command which additionally allows for
stepping into a target function. This change updates `step` and `s` to
be aliases for `_regexp-step`.

The existing `sif` alias ("Step Into Function") is not well known
amongst users. This change updates `step` and `s` to also work like
`sif`, taking an optional function name.

This is implemented to not break uses of `step` or `s` with a flag, for
example running `step -r func_to_avoid` works as expected.
This commit is contained in:
Dave Lee 2025-08-19 08:29:25 -07:00 committed by GitHub
parent 0037c2083f
commit 6e3c7b8244
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 36 additions and 11 deletions

View File

@ -335,7 +335,7 @@ void CommandInterpreter::Initialize() {
AddAlias("ni", cmd_obj_sp);
}
cmd_obj_sp = GetCommandSPExact("thread step-in");
cmd_obj_sp = GetCommandSPExact("_regexp-step");
if (cmd_obj_sp) {
AddAlias("s", cmd_obj_sp);
AddAlias("step", cmd_obj_sp);
@ -946,6 +946,27 @@ void CommandInterpreter::LoadCommandDictionary() {
jump_regex_cmd_sp;
}
}
std::shared_ptr<CommandObjectRegexCommand> step_regex_cmd_sp(
new CommandObjectRegexCommand(
*this, "_regexp-step",
"Single step, optionally to a specific function.",
"\n"
"_regexp-step // Single step\n"
"_regexp-step <function-name> // Step into the named function\n",
0, false));
if (step_regex_cmd_sp) {
if (step_regex_cmd_sp->AddRegexCommand("^[[:space:]]*$",
"thread step-in") &&
step_regex_cmd_sp->AddRegexCommand("^[[:space:]]*(-.+)$",
"thread step-in %1") &&
step_regex_cmd_sp->AddRegexCommand(
"^[[:space:]]*(.+)[[:space:]]*$",
"thread step-in --end-linenumber block --step-in-target %1")) {
m_command_dict[std::string(step_regex_cmd_sp->GetCommandName())] =
step_regex_cmd_sp;
}
}
}
int CommandInterpreter::GetCommandNamesMatchingPartialString(

View File

@ -83,14 +83,16 @@ class TestStepTarget(TestBase):
@expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr32343")
def test_with_command_and_block(self):
"""Test stepping over vrs. hitting breakpoints & subsequent stepping in various forms."""
self.do_command_and_block()
self.do_command_and_block(True)
def do_command_and_block(self, use_regexp_step=False):
thread = self.get_to_start()
result = lldb.SBCommandReturnObject()
self.dbg.GetCommandInterpreter().HandleCommand(
'thread step-in -t "lotsOfArgs" -e block', result
)
self.assertTrue(result.Succeeded(), "thread step-in command succeeded.")
if use_regexp_step:
self.expect("s lotsOfArgs")
else:
self.expect('thread step-in -t "lotsOfArgs" -e block')
frame = thread.frames[0]
self.assertEqual(frame.name, "lotsOfArgs", "Stepped to lotsOfArgs.")
@ -98,14 +100,16 @@ class TestStepTarget(TestBase):
@expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr32343")
def test_with_command_and_block_and_bad_name(self):
"""Test stepping over vrs. hitting breakpoints & subsequent stepping in various forms."""
self.do_with_command_and_block_and_bad_name()
self.do_with_command_and_block_and_bad_name(True)
def do_with_command_and_block_and_bad_name(self, use_regexp_step=False):
thread = self.get_to_start()
result = lldb.SBCommandReturnObject()
self.dbg.GetCommandInterpreter().HandleCommand(
'thread step-in -t "lotsOfArgsssss" -e block', result
)
self.assertTrue(result.Succeeded(), "thread step-in command succeeded.")
if use_regexp_step:
self.expect("s lotsOfArgsssss")
else:
self.expect('thread step-in -t "lotsOfArgsssss" -e block')
frame = thread.frames[0]