From d01f36bdfabaae60fa90134b70e2945bb530fa05 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 9 May 2023 14:20:31 -0600 Subject: [PATCH] Implement DAP attach request This implements the DAP "attach" request. Note that the copyright dates on the new test source file are not incorrect -- this was copied verbatim from another directory. Reviewed-By: Eli Zaretskii --- gdb/doc/gdb.texinfo | 8 +++++++ gdb/python/lib/gdb/dap/launch.py | 13 ++++++++++- gdb/testsuite/gdb.dap/attach.c | 25 +++++++++++++++++++++ gdb/testsuite/gdb.dap/attach.exp | 36 +++++++++++++++++++++++++++++++ gdb/testsuite/lib/dap-support.exp | 19 +++++++++++++--- 5 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 gdb/testsuite/gdb.dap/attach.c create mode 100644 gdb/testsuite/gdb.dap/attach.exp diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 40d1f244417..5823bf2aab8 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -39070,6 +39070,14 @@ If provided, this is a string that specifies the program to use. This corresponds to the @code{file} command. @xref{Files}. @end table +@value{GDBN} defines a parameter that can be passed to the +@code{attach} request: + +@table @code +@item pid +The process ID to which @value{GDBN} should attach. @xref{Attach}. +@end table + @node JIT Interface @chapter JIT Compilation Interface @cindex just-in-time compilation diff --git a/gdb/python/lib/gdb/dap/launch.py b/gdb/python/lib/gdb/dap/launch.py index 21499a339e1..a46be1dcca2 100644 --- a/gdb/python/lib/gdb/dap/launch.py +++ b/gdb/python/lib/gdb/dap/launch.py @@ -16,7 +16,7 @@ import gdb from .events import ExecutionInvoker from .server import request, capability -from .startup import send_gdb, in_gdb_thread +from .startup import send_gdb, send_gdb_with_response, in_gdb_thread _program = None @@ -45,6 +45,17 @@ def launch(*, program=None, args=[], env=None, **extra): send_gdb(lambda: _set_args_env(args, env)) +@request("attach") +def attach(*, pid, **args): + # Ensure configurationDone does not try to run. + global _program + _program = None + # Use send_gdb_with_response to ensure we get an error if the + # attach fails. + send_gdb_with_response("attach " + str(pid)) + return None + + @capability("supportsConfigurationDoneRequest") @request("configurationDone") def config_done(**args): diff --git a/gdb/testsuite/gdb.dap/attach.c b/gdb/testsuite/gdb.dap/attach.c new file mode 100644 index 00000000000..24c5283d1e6 --- /dev/null +++ b/gdb/testsuite/gdb.dap/attach.c @@ -0,0 +1,25 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2011-2023 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +int +main () +{ + sleep (600); + return 0; +} diff --git a/gdb/testsuite/gdb.dap/attach.exp b/gdb/testsuite/gdb.dap/attach.exp new file mode 100644 index 00000000000..5b308f94975 --- /dev/null +++ b/gdb/testsuite/gdb.dap/attach.exp @@ -0,0 +1,36 @@ +# Copyright 2023 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Test "attach" in DAP. + +require can_spawn_for_attach allow_dap_tests + +load_lib dap-support.exp + +standard_testfile + +if {[build_executable ${testfile}.exp $testfile] == -1} { + return +} + +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] != ""} { + dap_shutdown true +} + +kill_wait_spawned_process $test_spawn_id diff --git a/gdb/testsuite/lib/dap-support.exp b/gdb/testsuite/lib/dap-support.exp index ead295bdbfe..8667164fa11 100644 --- a/gdb/testsuite/lib/dap-support.exp +++ b/gdb/testsuite/lib/dap-support.exp @@ -270,9 +270,22 @@ proc dap_launch {file {args {}} {env {}}} { return [dap_check_request_and_response "startup - launch" launch $params] } -# Cleanly shut down gdb. NAME is used as the test name. -proc dap_shutdown {{name shutdown}} { - dap_check_request_and_response $name disconnect +# Start gdb, send a DAP initialize request, and then an attach request +# specifying PID as the inferior process ID. Returns the empty string +# on failure, or the response object from the attach request. +proc dap_attach {pid} { + if {[_dap_initialize "startup - initialize"] == ""} { + return "" + } + return [dap_check_request_and_response "startup - attach" attach \ + [format {o pid [i %s]} $pid]] +} + +# Cleanly shut down gdb. TERMINATE is passed as the terminateDebuggee +# parameter to the request. +proc dap_shutdown {{terminate false}} { + dap_check_request_and_response "shutdown" disconnect \ + [format {o terminateDebuggee [l %s]} $terminate] } # Search the event list EVENTS for an output event matching the regexp -- 2.30.2