aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/python/lib/gdb/dap/events.py28
-rw-r--r--gdb/python/lib/gdb/dap/launch.py4
-rw-r--r--gdb/testsuite/gdb.dap/attach.exp16
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