public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Pedro Alves <pedro@palves.net>
To: gdb-patches@sourceware.org
Subject: [PATCH 06/12] Improve vRun error reporting
Date: Fri, 19 Apr 2024 16:13:36 +0100	[thread overview]
Message-ID: <20240419151342.1592474-7-pedro@palves.net> (raw)
In-Reply-To: <20240419151342.1592474-1-pedro@palves.net>

After the previous commit, if starting the inferior process with "run"
(vRun packet) fails, GDBserver reports an error using the "E." textual
error packet.  On the GDB side, however, GDB doesn't yet do anything
with the textual error string.  This commit improves that.

This makes remote debugging output the same as native output, when
possible, another small step in the "local/remote parity" project.

E.g., before, against GNU/Linux GDBserver:

  (gdb) run
  Starting program: .../gdb.base/run-fail-twice/run-fail-twice.nox
  Running ".../gdb.base/run-fail-twice/run-fail-twice.nox" on the remote target failed

After, against GNU/Linux GDBserver (same as native):

  (gdb) run
  Starting program: .../gdb.base/run-fail-twice/run-fail-twice.nox
  During startup program exited with code 126.

To know whether we have a textual error message, extend packet_result
to carry that information.  While at it, convert packet_result to use
factory methods, and change its std::string parameter to a plain const
char *, as that it always what we have handy to pass to it.

Change-Id: Ib386f267522603f554b52a885b15229c9639e870
---
 gdb/remote.c | 67 ++++++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 55 insertions(+), 12 deletions(-)

diff --git a/gdb/remote.c b/gdb/remote.c
index cfb54de157d..8ef808c5ad6 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -158,20 +158,27 @@ enum packet_status
 /* Keeps packet's return value. If packet's return value is PACKET_ERROR,
    err_msg contains an error message string from E.string or the number
    stored as a string from E.num.  */
-struct packet_result
+class packet_result
 {
-  packet_result (enum packet_status status, std::string err_msg)
-    : m_status (status), m_err_msg (std::move (err_msg))
-  {
-    gdb_assert (status == PACKET_ERROR);
-  }
+private:
+  /* Private ctors for internal use.  Clients should use the public
+     factory static methods instead.  */
+
+  /* Construct a PACKET_ERROR packet_result.  */
+  packet_result (const char *err_msg, bool textual_err_msg)
+    : m_status (PACKET_ERROR),
+      m_err_msg (err_msg),
+      m_textual_err_msg (textual_err_msg)
+  {}
 
+  /* Construct an PACKET_OK/PACKET_UNKNOWN packet_result.  */
   explicit packet_result (enum packet_status status)
     : m_status (status)
   {
     gdb_assert (status != PACKET_ERROR);
   }
 
+public:
   enum packet_status status () const
   {
     return this->m_status;
@@ -183,9 +190,39 @@ struct packet_result
     return this->m_err_msg.c_str ();
   }
 
+  bool textual_err_msg () const
+  {
+    gdb_assert (this->m_status == PACKET_ERROR);
+    return this->m_textual_err_msg;
+  }
+
+  static packet_result make_numeric_error (const char *err_msg)
+  {
+    return packet_result (err_msg, false);
+  }
+
+  static packet_result make_textual_error (const char *err_msg)
+  {
+    return packet_result (err_msg, true);
+  }
+
+  static packet_result make_ok ()
+  {
+    return packet_result (PACKET_OK);
+  }
+
+  static packet_result make_unknown ()
+  {
+    return packet_result (PACKET_UNKNOWN);
+  }
+
 private:
   enum packet_status m_status;
   std::string m_err_msg;
+
+  /* True if we have a textual error message, from an "E.MESSAGE"
+     response.  */
+  bool m_textual_err_msg;
 };
 
 /* Enumeration of packets for a remote target.  */
@@ -2473,7 +2510,7 @@ packet_check_result (const char *buf, bool accept_msg)
 	  && isxdigit (buf[1]) && isxdigit (buf[2])
 	  && buf[3] == '\0')
 	/* "Enn"  - definitely an error.  */
-	return { PACKET_ERROR, buf + 1 };
+	return packet_result::make_numeric_error (buf + 1);
 
       /* Not every request accepts an error in a E.msg form.
 	 Some packets accepts only Enn, in this case E. is not
@@ -2485,19 +2522,19 @@ packet_check_result (const char *buf, bool accept_msg)
 	  if (buf[0] == 'E' && buf[1] == '.')
 	    {
 	      if (buf[2] != '\0')
-		return { PACKET_ERROR, buf + 2 };
+		return packet_result::make_textual_error (buf + 2);
 	      else
-		return { PACKET_ERROR, "no error provided" };
+		return packet_result::make_textual_error ("no error provided");
 	    }
 	}
 
       /* The packet may or may not be OK.  Just assume it is.  */
-      return packet_result (PACKET_OK);
+      return packet_result::make_ok ();
     }
   else
   {
     /* The stub does not support the packet.  */
-    return packet_result (PACKET_UNKNOWN);
+    return packet_result::make_unknown ();
   }
 }
 
@@ -10704,7 +10741,8 @@ remote_target::extended_remote_run (const std::string &args)
   putpkt (rs->buf);
   getpkt (&rs->buf);
 
-  switch ((m_features.packet_ok (rs->buf, PACKET_vRun)).status ())
+  packet_result result = m_features.packet_ok (rs->buf, PACKET_vRun);
+  switch (result.status ())
     {
     case PACKET_OK:
       /* We have a wait response.  All is well.  */
@@ -10712,6 +10750,11 @@ remote_target::extended_remote_run (const std::string &args)
     case PACKET_UNKNOWN:
       return -1;
     case PACKET_ERROR:
+      /* If we have a textual error message, print just that.  This
+	 makes remote debugging output the same as native output, when
+	 possible.  */
+      if (result.textual_err_msg ())
+	error (("%s"), result.err_msg ());
       if (remote_exec_file[0] == '\0')
 	error (_("Running the default executable on the remote target failed; "
 		 "try \"set remote exec-file\"?"));
-- 
2.43.2


  parent reply	other threads:[~2024-04-19 15:14 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-19 15:13 [PATCH 00/12] Fix attach/run failure handling - gdbserver & Windows, document "E.MESSAGE" RSP errors, more Pedro Alves
2024-04-19 15:13 ` [PATCH 01/12] Document conventions for describing packet syntax Pedro Alves
2024-04-19 15:25   ` Eli Zaretskii
2024-04-19 15:42     ` Eli Zaretskii
2024-04-22 19:10       ` Pedro Alves
2024-04-22 19:01     ` Pedro Alves
2024-04-22 19:44       ` Eli Zaretskii
2024-04-19 15:13 ` [PATCH 02/12] Centralize documentation of error and empty RSP responses Pedro Alves
2024-04-19 15:36   ` Eli Zaretskii
2024-04-19 15:42     ` Eli Zaretskii
2024-04-22 19:00     ` Pedro Alves
2024-04-22 19:42       ` Eli Zaretskii
2024-04-19 15:13 ` [PATCH 03/12] Document "E.MESSAGE" RSP errors Pedro Alves
2024-04-19 15:37   ` Eli Zaretskii
2024-04-22  8:50   ` Andrew Burgess
2024-04-22 19:04     ` Pedro Alves
2024-04-26 19:02       ` Pedro Alves
2024-04-26 19:18         ` Eli Zaretskii
2024-04-29 13:42         ` Andrew Burgess
2024-04-19 15:13 ` [PATCH 04/12] Windows: Fix run/attach hang after bad run/attach Pedro Alves
2024-04-19 18:35   ` Tom Tromey
2024-04-19 15:13 ` [PATCH 05/12] Fix "run" failure handling with GDBserver Pedro Alves
2024-04-19 18:41   ` Tom Tromey
2024-04-19 15:13 ` Pedro Alves [this message]
2024-04-19 18:43   ` [PATCH 06/12] Improve vRun error reporting Tom Tromey
2024-04-22 11:32     ` Alexandra Petlanova Hajkova
2024-04-19 15:13 ` [PATCH 07/12] Fix "attach" failure handling with GDBserver Pedro Alves
2024-04-19 18:47   ` Tom Tromey
2024-04-19 15:13 ` [PATCH 08/12] gdbserver: Fix vAttach response when attaching is not supported Pedro Alves
2024-04-19 18:48   ` Tom Tromey
2024-04-19 15:13 ` [PATCH 09/12] gdb_target_is_native -> gdb_protocol_is_native Pedro Alves
2024-04-19 18:50   ` Tom Tromey
2024-05-09  8:47     ` Bernd Edlinger
2024-05-09  9:47       ` Pedro Alves
2024-05-09 11:54         ` Bernd Edlinger
2024-05-09 12:05           ` Pedro Alves
2024-05-09 13:19             ` Bernd Edlinger
2024-05-09 13:31               ` Pedro Alves
2024-05-09 15:01                 ` Bernd Edlinger
2024-05-09 15:49                   ` Pedro Alves
2024-05-09 18:44                     ` Bernd Edlinger
2024-05-10 10:52                       ` [pushed] gdb sim testing, set gdb_protocol to "sim" Pedro Alves
2024-04-22  8:25   ` [PATCH 09/12] gdb_target_is_native -> gdb_protocol_is_native Aktemur, Tankut Baris
2024-04-23 12:33     ` Pedro Alves
2024-04-19 15:13 ` [PATCH 10/12] gdb_target_is_remote -> gdb_protocol_is_remote Pedro Alves
2024-04-19 18:56   ` Tom Tromey
2024-04-23 12:30     ` Pedro Alves
2024-04-22  8:30   ` Aktemur, Tankut Baris
2024-04-23 12:47     ` Pedro Alves
2024-04-24 13:48       ` Aktemur, Tankut Baris
2024-04-19 15:13 ` [PATCH 11/12] Eliminate gdb_is_target_remote / gdb_is_target_native & friends Pedro Alves
2024-04-19 18:57   ` Tom Tromey
2024-04-19 15:13 ` [PATCH 12/12] Fix gdb.base/attach.exp --pid test skipping on native-extended-gdbserver Pedro Alves
2024-04-19 18:59   ` Tom Tromey
2024-04-26 20:25 ` [PATCH 00/12] Fix attach/run failure handling - gdbserver & Windows, document "E.MESSAGE" RSP errors, more Pedro Alves

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=20240419151342.1592474-7-pedro@palves.net \
    --to=pedro@palves.net \
    --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).