diff --git a/gdb/python/lib/gdb/dap/next.py b/gdb/python/lib/gdb/dap/next.py index 1dc1d6dd74d..7e06b1b79dc 100644 --- a/gdb/python/lib/gdb/dap/next.py +++ b/gdb/python/lib/gdb/dap/next.py @@ -73,10 +73,10 @@ def step_in( exec_and_expect_stop(cmd) -@request("stepOut", response=False) +@request("stepOut", defer_stop_events=True) def step_out(*, threadId: int, singleThread: bool = False, **args): _handle_thread_step(threadId, singleThread, True) - exec_and_expect_stop("finish") + exec_and_expect_stop("finish &", propagate_exception=True) # This is a server-side request because it is funny: it wants to diff --git a/gdb/testsuite/gdb.dap/step-out.exp b/gdb/testsuite/gdb.dap/step-out.exp index 757f4ebdaca..31c50bb81ec 100644 --- a/gdb/testsuite/gdb.dap/step-out.exp +++ b/gdb/testsuite/gdb.dap/step-out.exp @@ -79,4 +79,15 @@ gdb_assert {[dict get $varlist variablesReference] > 0} \ gdb_assert {[dict get $varlist name] == "(return)"} \ "variable is return value" +set response_and_events [dap_request_and_response stepOut {o threadId [i 1]}] +set response [lindex $response_and_events 0] +if {[dict get $response success] == "true"} { + fail "stepOut from outermost frame should not succeed" +} else { + pass "stepOut from outermost frame failed like it should" +} + +dap_check_request_and_response "still stopped and may request backtrace" \ + stackTrace {o threadId [i 1]} + dap_shutdown