From: Andrew Burgess <aburgess@redhat.com>
To: gdb-patches@sourceware.org
Cc: Andrew Burgess <aburgess@redhat.com>, Eli Zaretskii <eliz@gnu.org>
Subject: [PATCHv2 13/14] gdb: new maintenance command to help debug remote argument issues
Date: Mon, 4 Nov 2024 14:45:57 +0000 [thread overview]
Message-ID: <ba34c44c17d527c49e35b0f3e27841f7f958e914.1730731085.git.aburgess@redhat.com> (raw)
In-Reply-To: <cover.1730731085.git.aburgess@redhat.com>
Add a new maintenance command 'maint test-remote-args', this command
takes an argument string and splits it using gdb::remote_args::split
and then joins the result using gdb::remote_args::join and prints all
of the results. This is useful for diagnosing problems with remote
argument passing.
This new command is identical to what the remote argument self-tests
do, I found it easier to have a maintenance command available for
testing rather than having to add a new selftest and recompile GDB.
Reviewed-By: Eli Zaretskii <eliz@gnu.org>
---
gdb/NEWS | 4 ++
gdb/doc/gdb.texinfo | 20 +++++++
gdb/remote.c | 59 +++++++++++++++++++
.../gdb.base/maint-test-remote-args.exp | 40 +++++++++++++
4 files changed, 123 insertions(+)
create mode 100644 gdb/testsuite/gdb.base/maint-test-remote-args.exp
diff --git a/gdb/NEWS b/gdb/NEWS
index 6e829d7dc87..674566351f9 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -95,6 +95,10 @@ maintenance info blocks [ADDRESS]
are listed starting at the inner global block out to the most inner
block.
+maintenance test-remote-args ARGS
+ Test splitting and joining of inferior arguments ARGS as they would
+ be split and joined when being passed to a remote target.
+
* Changed commands
remove-symbol-file
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index a7058e4ee4d..fb31b2ca5b3 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -42573,6 +42573,26 @@
@value{GDBN} supports. They are used by the testsuite for exercising
the settings infrastructure.
+@kindex maint test-remote-args
+@item maint test-remote-args @var{args}
+For targets that don't support passing inferior arguments as a single
+string (@pxref{single-inf-arg}), @value{GDBN} will attempt to split
+the inferior arguments before passing them to the remote target, and
+the remote target might choose to join the inferior arguments upon
+receipt. Historically gdbserver did join inferior arguments, but now
+it will request inferior arguments be passed as a single string if
+@value{GDBN} supports this feature.
+
+This maintenance command splits @var{args} as @value{GDBN} would
+normally split such an argument string before passing the arguments to
+a remote target, the split arguments are then printed.
+
+The split arguments are then joined together as gdbserver would join
+them, and the result is printed.
+
+This command is intended to help diagnose issues passing inferior
+arguments to remote targets.
+
@kindex maint set backtrace-on-fatal-signal
@kindex maint show backtrace-on-fatal-signal
@item maint set backtrace-on-fatal-signal [on|off]
diff --git a/gdb/remote.c b/gdb/remote.c
index 8c33ec116bd..9361a10bd5e 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -12179,6 +12179,51 @@ cli_packet_command (const char *args, int from_tty)
send_remote_packet (view, &cb);
}
+/* Implement 'maint test-remote-args' command.
+
+ Treat ARGS as an argument string. Split the remote arguments using
+ gdb::remote_args::split, and then join using gdb::remote_args::join.
+ The split and joined arguments are printed out. Additionally, the
+ joined arguments are split and joined a second time, and compared to the
+ result of the first join, this provides some basic validation that GDB
+ sess the joined arguments as equivalent to the original argument
+ string. */
+
+static void
+test_remote_args_command (const char *args, int from_tty)
+{
+ std::vector<std::string> split_args = gdb::remote_args::split (args);
+
+ gdb_printf ("Input (%s)\n", args);
+ for (const auto & a : split_args)
+ gdb_printf (" (%s)\n", a.c_str ());
+
+ std::vector<gdb::unique_xmalloc_ptr<char>> tmp_split_args;
+ for (const auto & a : split_args)
+ tmp_split_args.emplace_back (make_unique_xstrdup (a.c_str ()));
+
+ std::string joined_args = gdb::remote_args::join (tmp_split_args);
+
+ gdb_printf ("Output (%s)\n", joined_args.c_str ());
+
+ std::vector<std::string> resplit = gdb::remote_args::split (joined_args);
+
+ tmp_split_args.clear ();
+ for (const auto & a : resplit)
+ tmp_split_args.emplace_back (make_unique_xstrdup (a.c_str ()));
+
+ std::string rejoined = gdb::remote_args::join (tmp_split_args);
+
+ if (joined_args != rejoined || split_args != resplit)
+ {
+ gdb_printf ("FAILURE ON REJOINING\n");
+ gdb_printf ("Resplit args:\n");
+ for (const auto & a : resplit)
+ gdb_printf (" (%s)\n", a.c_str ());
+ gdb_printf ("Rejoined (%s)\n", rejoined.c_str ());
+ }
+}
+
#if 0
/* --------- UNIT_TEST for THREAD oriented PACKETS ------------------- */
@@ -16614,6 +16659,20 @@ from the target."),
/* Eventually initialize fileio. See fileio.c */
initialize_remote_fileio (&remote_set_cmdlist, &remote_show_cmdlist);
+ add_cmd ("test-remote-args", class_maintenance,
+ test_remote_args_command, _("\
+Test remote argument splitting and joining.\n \
+ maintenance test-remote-args ARGS\n\
+For remote targets that don't support passing inferior arguments as a\n\
+single string, GDB needs to split the inferior arguments before passing\n\
+them, and gdbserver needs to join the arguments it receives.\n\
+This command splits ARGS just as GDB would before passing them to a\n\
+remote target, and prints the result. This command then joins the\n\
+arguments just as gdbserver would, and prints the results.\n\
+This command is useful in diagnosing problems when passing arguments\n\
+between GDB and a remote target."),
+ &maintenancelist);
+
#if GDB_SELF_TEST
selftests::register_test ("remote_memory_tagging",
selftests::test_memory_tagging_functions);
diff --git a/gdb/testsuite/gdb.base/maint-test-remote-args.exp b/gdb/testsuite/gdb.base/maint-test-remote-args.exp
new file mode 100644
index 00000000000..3daf0725932
--- /dev/null
+++ b/gdb/testsuite/gdb.base/maint-test-remote-args.exp
@@ -0,0 +1,40 @@
+# Copyright 2024 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 'maint test-remote-args' command.
+#
+# We do minimal testing in here. If you are thinking of adding a new
+# test here then you are most likely adding the test in the wrong
+# place. Remote argument testing is checked in the following test
+# scripts: gdb.base/args.exp, gdb.base/inferior-args.exp,
+# gdb.base/startup-with-shell.exp, and gdb.python/py-inferior.exp.
+# The test gdb.gdb/unittest.exp also runs 'maint selftest
+# remote-args', which are the remote argument self tests.
+#
+# If you have a new test for an argument that was being passed
+# incorrectly, then add the test to one of those scripts.
+#
+# This file is ONLY for validating that the 'maint test-remote-args'
+# command itself is working.
+
+gdb_start
+
+gdb_test "maint test-remote-args a b c" \
+ [multi_line \
+ "Input \\(a b c\\)" \
+ " \\(a\\)" \
+ " \\(b\\)" \
+ " \\(c\\)" \
+ "Output \\(a b c\\)"]
--
2.25.4
next prev parent reply other threads:[~2024-11-04 14:46 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-09 14:26 [PATCH 00/16] Inferior argument (inc for remote targets) changes Andrew Burgess
2024-01-09 14:26 ` [PATCH 01/16] libiberty/buildargv: POSIX behaviour for backslash handling Andrew Burgess
2024-01-09 14:26 ` [PATCH 02/16] gdb/testsuite: add some xfail in gdb.base/startup-with-shell.exp Andrew Burgess
2024-01-09 14:26 ` [PATCH 03/16] gdb: Support some escaping of args with startup-with-shell being off Andrew Burgess
2024-01-09 14:26 ` [PATCH 04/16] gdb: remove the !startup_with_shell path from construct_inferior_arguments Andrew Burgess
2024-01-21 3:56 ` Keith Seitz
2024-10-18 15:09 ` Andrew Burgess
2024-01-09 14:26 ` [PATCH 05/16] gdbserver: convert program_args to a single string Andrew Burgess
2024-01-09 14:26 ` [PATCH 06/16] gdbsupport: have construct_inferior_arguments take an escape function Andrew Burgess
2024-01-09 14:26 ` [PATCH 07/16] gdbsupport: split escape_shell_characters in two Andrew Burgess
2024-01-09 14:26 ` [PATCH 08/16] gdb: move remote arg splitting and joining into gdbsupport/ Andrew Burgess
2024-01-21 3:57 ` Keith Seitz
2024-10-18 15:21 ` Andrew Burgess
2024-01-09 14:26 ` [PATCH 09/16] gdb/python: change escaping rules when setting arguments Andrew Burgess
2024-01-09 16:30 ` Eli Zaretskii
2024-01-09 14:26 ` [PATCH 10/16] gdb: add remote argument passing self tests Andrew Burgess
2024-01-21 3:57 ` Keith Seitz
2024-10-18 15:23 ` Andrew Burgess
2024-01-09 14:26 ` [PATCH 11/16] gdb/gdbserver: pass inferior arguments as a single string Andrew Burgess
2024-01-09 16:34 ` Eli Zaretskii
2024-01-09 16:35 ` Eli Zaretskii
2024-01-09 14:26 ` [PATCH 12/16] gdb/gdbserver: add a '--no-escape-args' command line option Andrew Burgess
2024-01-09 16:43 ` Eli Zaretskii
2024-01-21 3:57 ` Keith Seitz
2024-10-18 15:31 ` Andrew Burgess
2024-01-09 14:26 ` [PATCH 13/16] gdb: allow 'set args' and run commands to contain newlines Andrew Burgess
2024-01-09 16:44 ` Eli Zaretskii
2024-01-21 3:57 ` Keith Seitz
2024-10-23 13:01 ` Andrew Burgess
2024-10-25 16:15 ` Keith Seitz
2024-10-30 15:57 ` Andrew Burgess
2024-01-09 14:26 ` [PATCH 14/16] gdb/gdbserver: remove some uses of free_vector_argv Andrew Burgess
2024-01-09 14:26 ` [PATCH 15/16] gdb: new maintenance command to help debug remote argument issues Andrew Burgess
2024-01-09 16:32 ` Eli Zaretskii
2024-01-21 3:57 ` Keith Seitz
2024-10-23 15:34 ` Andrew Burgess
2024-10-25 17:25 ` Keith Seitz
2024-10-30 15:58 ` Andrew Burgess
2024-01-09 14:26 ` [PATCH 16/16] gdb/gdbserver: rework argument splitting and joining Andrew Burgess
2024-01-09 16:37 ` Eli Zaretskii
2024-01-21 3:57 ` Keith Seitz
2024-10-18 15:39 ` Andrew Burgess
2024-01-09 16:58 ` [PATCH 00/16] Inferior argument (inc for remote targets) changes Eli Zaretskii
2024-01-20 22:46 ` Andrew Burgess
2024-01-21 10:22 ` Eli Zaretskii
2024-01-22 10:29 ` Andrew Burgess
2024-01-10 8:28 ` Michael Weghorn
2024-01-21 3:56 ` Keith Seitz
2024-11-04 14:45 ` [PATCHv2 00/14] " Andrew Burgess
2024-11-04 14:45 ` [PATCHv2 01/14] gdb/testsuite: add some xfail in gdb.base/startup-with-shell.exp Andrew Burgess
2024-11-04 14:45 ` [PATCHv2 02/14] gdb: Support some escaping of args with startup-with-shell being off Andrew Burgess
2024-11-04 14:45 ` [PATCHv2 03/14] gdb: remove the !startup_with_shell path from construct_inferior_arguments Andrew Burgess
2024-11-04 14:45 ` [PATCHv2 04/14] gdbserver: convert program_args to a single string Andrew Burgess
2024-11-04 14:45 ` [PATCHv2 05/14] gdb: move remote arg splitting and joining into gdbsupport/ Andrew Burgess
2024-11-04 14:45 ` [PATCHv2 06/14] gdb: add remote argument passing self tests Andrew Burgess
2024-11-04 14:45 ` [PATCHv2 07/14] gdb: split up construct_inferior_arguments Andrew Burgess
2024-11-04 14:45 ` [PATCHv2 08/14] gdb/python: change escaping rules when setting arguments Andrew Burgess
2024-11-04 14:45 ` [PATCHv2 09/14] gdb/gdbserver: pass inferior arguments as a single string Andrew Burgess
2024-11-04 14:45 ` [PATCHv2 10/14] gdb/gdbserver: add a '--no-escape-args' command line option Andrew Burgess
2024-11-04 14:45 ` [PATCHv2 11/14] gdb: allow 'set args' and run commands to contain newlines Andrew Burgess
2024-11-04 16:52 ` Eli Zaretskii
2024-11-04 14:45 ` [PATCHv2 12/14] gdb/gdbserver: remove some uses of free_vector_argv Andrew Burgess
2024-11-04 14:45 ` Andrew Burgess [this message]
2024-11-04 14:45 ` [PATCHv2 14/14] gdb/gdbserver: rework argument splitting and joining Andrew Burgess
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ba34c44c17d527c49e35b0f3e27841f7f958e914.1730731085.git.aburgess@redhat.com \
--to=aburgess@redhat.com \
--cc=eliz@gnu.org \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).