Skip to content

[Dexter] Add DAP stepNext and stepOut support #152717

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Aug 13, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 20 additions & 4 deletions cross-project-tests/debuginfo-tests/dexter/dex/debugger/DAP.py
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,10 @@ def _handle_message(
# response or the event, since the DAP does not specify an order in which they are sent. May need revisiting
# if there turns out to be some odd ordering issues, e.g. if we can receive messages in the order
# ["response: continued", "event: stopped", "event: continued"].
if message["command"] == "continue" and message["success"] == True:
if (
message["command"] in ["continue", "stepIn", "next", "stepOut"]
and message["success"] == True
):
debugger_state.is_running = True
# Reset all state that is invalidated upon program continue.
debugger_state.stopped_reason = None
Expand Down Expand Up @@ -635,21 +638,34 @@ def launch(self, cmdline):
def _post_step_hook(self):
"""Hook to be executed after completing a step request."""

def step_in(self):
def _step(self, step_request_string):
self._flush_breakpoints()
step_req_id = self.send_message(
self.make_request("stepIn", {"threadId": self._debugger_state.thread})
self.make_request(
step_request_string, {"threadId": self._debugger_state.thread}
)
)
response = self._await_response(step_req_id)
if not response["success"]:
raise DebuggerException("failed to step")
raise DebuggerException(
f"failed to perform debugger action: '{step_request_string}'"
)
# If we've "stepped" to a breakpoint, then continue to hit the breakpoint properly.
# NB: This is an issue that only seems relevant to LLDB, but is also harmless outside of LLDB; if it turns out
# to cause issues for other debuggers, we can move it to a post-step hook.
while self._debugger_state.is_running:
time.sleep(0.001)
self._post_step_hook()

def step_in(self):
self._step("stepIn")

def step_next(self):
self._step("next")

def step_out(self):
self._step("stepOut")

def go(self) -> ReturnCode:
self._flush_breakpoints()
continue_req_id = self.send_message(
Expand Down
Loading