diff options
-rw-r--r-- | gdb/python/lib/gdb/dap/events.py | 28 | ||||
-rw-r--r-- | gdb/python/lib/gdb/dap/launch.py | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.dap/attach.exp | 16 |
3 files changed, 28 insertions, 20 deletions
diff --git a/gdb/python/lib/gdb/dap/events.py b/gdb/python/lib/gdb/dap/events.py index bb2d1c9..4130222 100644 --- a/gdb/python/lib/gdb/dap/events.py +++ b/gdb/python/lib/gdb/dap/events.py @@ -147,14 +147,14 @@ def _cont(event): ) -_suppress_stop = False +_expected_stop_reason = None @in_gdb_thread -def suppress_stop(): - """Indicate that the next stop should not emit an event.""" - global _suppress_stop - _suppress_stop = True +def expect_stop(reason: str): + """Indicate that the next stop should be for REASON.""" + global _expected_stop_reason + _expected_stop_reason = reason _expected_pause = False @@ -209,24 +209,22 @@ def _on_stop(event): global inferior_running inferior_running = False - global _suppress_stop - if _suppress_stop: - _suppress_stop = False - log("suppressing stop in _on_stop") - return - log("entering _on_stop: " + repr(event)) - log(" details: " + repr(event.details)) + if hasattr(event, "details"): + log(" details: " + repr(event.details)) obj = { "threadId": gdb.selected_thread().global_num, "allThreadsStopped": True, } if isinstance(event, gdb.BreakpointEvent): obj["hitBreakpointIds"] = [x.number for x in event.breakpoints] + global _expected_pause - # Some stop events still do not emit details. For example, - # 'attach' causes a reason-less stop. - if "reason" not in event.details: + global _expected_stop_reason + if _expected_stop_reason is not None: + obj["reason"] = _expected_stop_reason + _expected_stop_reason = None + elif "reason" not in event.details: # This can only really happen via a "repl" evaluation of # something like "attach". In this case just emit a generic # stop. diff --git a/gdb/python/lib/gdb/dap/launch.py b/gdb/python/lib/gdb/dap/launch.py index bf9640a..184af16 100644 --- a/gdb/python/lib/gdb/dap/launch.py +++ b/gdb/python/lib/gdb/dap/launch.py @@ -18,7 +18,7 @@ import gdb # These are deprecated in 3.9, but required in older versions. from typing import Mapping, Optional, Sequence -from .events import exec_and_expect_stop, expect_process, suppress_stop +from .events import exec_and_expect_stop, expect_process, expect_stop from .server import request, capability from .startup import exec_and_log, DAPException @@ -88,7 +88,7 @@ def attach( else: raise DAPException("attach requires either 'pid' or 'target'") expect_process("attach") - suppress_stop() + expect_stop("attach") exec_and_log(cmd) diff --git a/gdb/testsuite/gdb.dap/attach.exp b/gdb/testsuite/gdb.dap/attach.exp index 2b30e53..ce2a16c 100644 --- a/gdb/testsuite/gdb.dap/attach.exp +++ b/gdb/testsuite/gdb.dap/attach.exp @@ -28,9 +28,19 @@ if {[build_executable ${testfile}.exp $testfile] == -1} { set test_spawn_id [spawn_wait_for_attach $binfile] set testpid [spawn_id_get_pid $test_spawn_id] -# We just want to test that attaching works at all. -if {[dap_attach $testpid $binfile] != ""} { - dap_shutdown true +# Test that attaching works at all. +set result [dap_attach $testpid $binfile] + +set found 0 +foreach ev [lindex $result 1] { + if {[dict get $ev type] == "event" + && [dict get $ev event] == "stopped" + && [dict get $ev body reason] == "attach"} { + set found 1 + } } +gdb_assert {$found} "saw stopped event for attach" + +dap_shutdown true kill_wait_spawned_process $test_spawn_id |