This adds the "cwd" parameter to the DAP launch request.
This came up here:
https://github.com/eclipse-cdt-cloud/cdt-gdb-adapter/issues/90
... and seemed like a good idea.
Reviewed-By: Eli Zaretskii <eliz@gnu.org>
provided as command-line arguments to the inferior, as if by
@code{set args}. @xref{Arguments}.
+@item cwd
+If provided, this should be a string. @value{GDBN} will change its
+working directory to this directory, as if by the @code{cd} command
+(@pxref{Working Directory}). The launched program will inherit this
+as its working directory. Note that change of directory happens
+before the @code{program} parameter is processed. This will affect
+the result if @code{program} is a relative filename.
+
@item env
If provided, this should be an object. Each key of the object will be
used as the name of an environment variable; each value must be a
from .startup import send_gdb, send_gdb_with_response, in_gdb_thread, exec_and_log
+# The program being launched, or None. This should only be access
+# from the DAP thread.
_program = None
@in_gdb_thread
-def _set_args_env(args, env):
+def _launch_setup(program, cwd, args, env, stopAtBeginningOfMainSubprogram):
+ if cwd is not None:
+ exec_and_log("cd " + cwd)
+ if program is not None:
+ exec_and_log("file " + program)
inf = gdb.selected_inferior()
+ if stopAtBeginningOfMainSubprogram:
+ main = inf.main_name
+ if main is not None:
+ exec_and_log("tbreak " + main)
inf.arguments = args
if env is not None:
inf.clear_env()
inf.set_env(name, value)
-@in_gdb_thread
-def _break_at_main():
- inf = gdb.selected_inferior()
- main = inf.main_name
- if main is not None:
- exec_and_log("tbreak " + main)
-
-
# Any parameters here are necessarily extensions -- DAP requires this
# from implementations. Any additions or changes here should be
# documented in the gdb manual.
def launch(
*,
program: Optional[str] = None,
+ cwd: Optional[str] = None,
args: Sequence[str] = (),
env: Optional[Mapping[str, str]] = None,
stopAtBeginningOfMainSubprogram: bool = False,
**extra,
):
- if program is not None:
- global _program
- _program = program
- send_gdb("file " + _program)
- if stopAtBeginningOfMainSubprogram:
- send_gdb(_break_at_main)
- if len(args) > 0 or env is not None:
- send_gdb(lambda: _set_args_env(args, env))
+ global _program
+ _program = program
+ send_gdb(
+ lambda: _launch_setup(program, cwd, args, env, stopAtBeginningOfMainSubprogram)
+ )
@request("attach")
--- /dev/null
+# 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 <http://www.gnu.org/licenses/>.
+
+# Test the cwd extension.
+
+require allow_dap_tests {!is_remote host}
+
+load_lib dap-support.exp
+
+standard_testfile attach.c
+
+if {[build_executable ${testfile}.exp $testfile $srcfile] == -1} {
+ return
+}
+
+# Starting the inferior will fail if the change of cwd does not work.
+set the_dir [file dirname $testfile]
+set the_file [file tail $testfile]
+if {[dap_launch $the_file cwd $the_dir stop_at_main 1] == ""} {
+ return
+}
+
+dap_check_request_and_response "start inferior" configurationDone
+# We didn't explicitly set a breakpoint, so if we hit one, it worked.
+dap_wait_for_event_and_check "stopped at function breakpoint" stopped \
+ "body reason" breakpoint
+
+dap_shutdown
# * stop_at_main - value is ignored, the presence of this means that
# "stopAtBeginningOfMainSubprogram" will be passed to the launch
# request.
+# * cwd - value is the working directory to use.
#
# After this proc is called, gdb will be ready to accept breakpoint
# requests.
append params { stopAtBeginningOfMainSubprogram [l true]}
}
+ cwd {
+ append envlist " cwd [format {[%s]} [list s $value]]"
+ }
+
default {
error "unrecognized parameter $key"
}