[2/4] gdbserver: Add debug-file option

Message ID 20190416101729.16176-3-alan.hayward@arm.com
State New
Headers show
Series
  • gdbserver/testsuite : Capture gdbserver debug output during testing
Related show

Commit Message

Alan Hayward April 16, 2019, 10:17 a.m.
Add command line option to send all debug output to a given file.
Always default back to stderr.

Add matching monitor command. Add documentation.

gdb/doc/ChangeLog:

2019-04-16  Alan Hayward  <alan.hayward@arm.com>

	* gdb.texinfo
	(Other Command-Line Arguments for gdbserver): Add debug-file
	option.
	(Monitor Commands for gdbserver): Likewise.
	(gdbserver man): Likewise.

gdb/gdbserver/ChangeLog:

2019-04-16  Alan Hayward  <alan.hayward@arm.com>

	* debug.c (debug_set_output): New function.
	(debug_vprintf): Send output to debug_file.
	(debug_flush): Likewise.
	* debug.h (debug_set_output): New declaration.
	* server.c (handle_monitor_command): Add debug-file option.
	(captured_main): Likewise.
---
 gdb/doc/gdb.texinfo    | 16 ++++++++++++++--
 gdb/gdbserver/debug.c  | 42 +++++++++++++++++++++++++++++++++++++++---
 gdb/gdbserver/debug.h  |  5 +++++
 gdb/gdbserver/server.c |  6 ++++++
 4 files changed, 64 insertions(+), 5 deletions(-)

-- 
2.20.1 (Apple Git-117)

Comments

Eli Zaretskii April 16, 2019, 2:43 p.m. | #1
> From: Alan Hayward <Alan.Hayward@arm.com>

> CC: nd <nd@arm.com>, Alan Hayward <Alan.Hayward@arm.com>

> Date: Tue, 16 Apr 2019 10:17:41 +0000

> 

> gdb/doc/ChangeLog:

> 

> 2019-04-16  Alan Hayward  <alan.hayward@arm.com>

> 

> 	* gdb.texinfo

> 	(Other Command-Line Arguments for gdbserver): Add debug-file


The node name in parentheses should be on the same line as
gdb.texinfo.

> 	(Monitor Commands for gdbserver): Likewise.

> 	(gdbserver man): Likewise.


It is better to have a list of node names in parentheses, with only
one description, than having separate entries that say "Likewise".

> +@cindex @option{--debug-file}, @code{gdbserver} option


I think it would be good to have here an additional index entry:

  @cindex @code{gdbserver}, send all debug output to a single file

> +The @option{--debug-file=filename} option tells @code{gdbserver} to

                            ^^^^^^^^
"filename" should be in @var here, as it is a parameter.

> +write any debug output to the given file.  These options are intended

                          ^^^^^^^^^^^^^^^^^
"to the given @var{filename}", so as to reference the parameter.

> +@item --debug-file=filename

> +Instruct @code{gdbserver} to send any debug output to the given file.


Same here.

The documentation changes are okay with these nits fixed.

Thanks.
Tom Tromey April 16, 2019, 7:39 p.m. | #2
>>>>> "Alan" == Alan Hayward <Alan.Hayward@arm.com> writes:


Alan> Add command line option to send all debug output to a given file.
Alan> Always default back to stderr.

Alan> Add matching monitor command. Add documentation.

Thanks.  The code parts of this are ok.

One little nit:

Alan> +  debug_file = fptr;
Alan> +  return;
Alan> +}

...this "return;" can be removed.

Tom
Alan Hayward April 17, 2019, 9:39 a.m. | #3
> 

> On 16 Apr 2019, at 15:43, Eli Zaretskii <eliz@gnu.org> wrote:

> 

>> From: Alan Hayward <Alan.Hayward@arm.com>

>> CC: nd <nd@arm.com>, Alan Hayward <Alan.Hayward@arm.com>

>> Date: Tue, 16 Apr 2019 10:17:41 +0000

>> 

>> gdb/doc/ChangeLog:

>> 

>> 2019-04-16  Alan Hayward  <alan.hayward@arm.com>

>> 

>> 	* gdb.texinfo

>> 	(Other Command-Line Arguments for gdbserver): Add debug-file

> 

> The node name in parentheses should be on the same line as

> gdb.texinfo.


Fixed.

> 

>> 	(Monitor Commands for gdbserver): Likewise.

>> 	(gdbserver man): Likewise.

> 

> It is better to have a list of node names in parentheses, with only

> one description, than having separate entries that say "Likewise”.


Wasn’t aware it could be done that way. Fixed.

> 

>> +@cindex @option{--debug-file}, @code{gdbserver} option

> 

> I think it would be good to have here an additional index entry:

> 

> @cindex @code{gdbserver}, send all debug output to a single file


Makes sense. Added.

> 

>> +The @option{--debug-file=filename} option tells @code{gdbserver} to

>                           ^^^^^^^^

> "filename" should be in @var here, as it is a parameter.


Done.

> 

>> +write any debug output to the given file.  These options are intended

>                         ^^^^^^^^^^^^^^^^^

> "to the given @var{filename}", so as to reference the parameter.


Done.

> 

>> +@item --debug-file=filename

>> +Instruct @code{gdbserver} to send any debug output to the given file.

> 

> Same here.


Done.

> 

> The documentation changes are okay with these nits fixed.

> 

> Thanks.


> 

> On 16 Apr 2019, at 20:39, Tom Tromey <tom@tromey.com> wrote:

> 

>>>>>> "Alan" == Alan Hayward <Alan.Hayward@arm.com> writes:

> 

> Alan> Add command line option to send all debug output to a given file.

> Alan> Always default back to stderr.

> 

> Alan> Add matching monitor command. Add documentation.

> 

> Thanks.  The code parts of this are ok.

> 

> One little nit:

> 

> Alan> +  debug_file = fptr;

> Alan> +  return;

> Alan> +}

> 

> ...this "return;" can be removed.

> 


Done.



Thanks!

Pushed the following:




diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
index 27e65ea56c..64073278fa 100644
--- a/gdb/doc/ChangeLog
+++ b/gdb/doc/ChangeLog
@@ -1,3 +1,9 @@
+2019-04-17  Alan Hayward  <alan.hayward@arm.com>
+
+       * gdb.texinfo (Other Command-Line Arguments for gdbserver)
+       (Monitor Commands for gdbserver)
+       (gdbserver man): Add debug-file option.
+
2019-04-08  Kevin Buettner  <kevinb@redhat.com>

       * python.texi (Inferiors In Python): Rename
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index f410d026b8..a3a5f3e28c 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -21332,8 +21332,12 @@ The @option{--debug} option tells @code{gdbserver} to display extra
status information about the debugging process.
@cindex @option{--remote-debug}, @code{gdbserver} option
The @option{--remote-debug} option tells @code{gdbserver} to display
-remote protocol debug output.  These options are intended for
-@code{gdbserver} development and for bug reports to the developers.
+remote protocol debug output.
+@cindex @option{--debug-file}, @code{gdbserver} option
+@cindex @code{gdbserver}, send all debug output to a single file
+The @option{--debug-file=@var{filename}} option tells @code{gdbserver} to
+write any debug output to the given @var{filename}.  These options are intended
+for @code{gdbserver} development and for bug reports to the developers.

@cindex @option{--debug-format}, @code{gdbserver} option
The @option{--debug-format=option1[,option2,...]} option tells
@@ -21433,6 +21437,10 @@ Disable or enable general debugging messages.
Disable or enable specific debugging messages associated with the remote
protocol (@pxref{Remote Protocol}).

+@item monitor set debug-file filename
+@itemx monitor set debug-file
+Send any debug output to the given file, or to stderr.
+
@item monitor set debug-format option1@r{[},option2,...@r{]}
Specify additional text to add to debugging messages.
Possible options are:
@@ -44563,6 +44571,11 @@ Instruct @code{gdbserver} to display remote protocol debug output.
This option is intended for @code{gdbserver} development and for bug reports to
the developers.

+@item --debug-file=@var{filename}
+Instruct @code{gdbserver} to send any debug output to the given @var{filename}.
+This option is intended for @code{gdbserver} development and for bug reports to
+the developers.
+
@item --debug-format=option1@r{[},option2,...@r{]}
Instruct @code{gdbserver} to include extra information in each line
of debugging output.
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index 0581f59b5d..d3380d6145 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,12 @@
+2019-04-17  Alan Hayward  <alan.hayward@arm.com>
+
+       * debug.c (debug_set_output): New function.
+       (debug_vprintf): Send output to debug_file.
+       (debug_flush): Likewise.
+       * debug.h (debug_set_output): New declaration.
+       * server.c (handle_monitor_command): Add debug-file option.
+       (captured_main): Likewise.
+
2019-04-17  Alan Hayward  <alan.hayward@arm.com>

       * debug.c (remote_debug): Add definition.
diff --git a/gdb/gdbserver/debug.c b/gdb/gdbserver/debug.c
index 7c4c77afe2..d80cd52540 100644
--- a/gdb/gdbserver/debug.c
+++ b/gdb/gdbserver/debug.c
@@ -23,6 +23,9 @@
int remote_debug = 0;
#endif

+/* Output file for debugging.  Default to standard error.  */
+FILE *debug_file = stderr;
+
/* Enable miscellaneous debugging output.  The name is historical - it
   was originally used to debug LinuxThreads support.  */
int debug_threads;
@@ -30,6 +33,38 @@ int debug_threads;
/* Include timestamps in debugging output.  */
int debug_timestamp;

+#if !defined (IN_PROCESS_AGENT)
+
+/* See debug.h.  */
+
+void
+debug_set_output (const char *new_debug_file)
+{
+  /* Close any existing file and reset to standard error.  */
+  if (debug_file != stderr)
+    {
+      fclose (debug_file);
+    }
+  debug_file = stderr;
+
+  /* Catch empty filenames.  */
+  if (new_debug_file == nullptr || strlen (new_debug_file) == 0)
+    return;
+
+  FILE *fptr = fopen (new_debug_file, "w");
+
+  if (fptr == nullptr)
+    {
+      debug_printf ("Cannot open %s for writing. %s. Switching to stderr.\n",
+                   new_debug_file, strerror (errno));
+      return;
+    }
+
+  debug_file = fptr;
+}
+
+#endif
+
/* Print a debugging message.
   If the text begins a new line it is preceded by a timestamp.
   We don't get fancy with newline checking, we just check whether the
@@ -50,11 +85,11 @@ debug_vprintf (const char *format, va_list ap)
      seconds s = duration_cast<seconds> (now.time_since_epoch ());
      microseconds us = duration_cast<microseconds> (now.time_since_epoch ()) - s;

-      fprintf (stderr, "%ld.%06ld ", (long) s.count (), (long) us.count ());
+      fprintf (debug_file, "%ld.%06ld ", (long) s.count (), (long) us.count ());
    }
#endif

-  vfprintf (stderr, format, ap);
+  vfprintf (debug_file, format, ap);

#if !defined (IN_PROCESS_AGENT)
  if (*format)
@@ -69,7 +104,7 @@ debug_vprintf (const char *format, va_list ap)
void
debug_flush (void)
{
-  fflush (stderr);
+  fflush (debug_file);
}

/* Notify the user that the code is entering FUNCTION_NAME.
diff --git a/gdb/gdbserver/debug.h b/gdb/gdbserver/debug.h
index c8d5e3365e..f65c91c9eb 100644
--- a/gdb/gdbserver/debug.h
+++ b/gdb/gdbserver/debug.h
@@ -21,6 +21,11 @@

#if !defined (IN_PROCESS_AGENT)
extern int remote_debug;
+
+/* Switch all debug output to DEBUG_FILE.  If DEBUG_FILE is nullptr or an
+   empty string, or if the file cannot be opened, then debug output is sent to
+   stderr.  */
+void debug_set_output (const char *debug_file);
#endif

extern int debug_threads;
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index 3f6c849dbc..36510ad1b2 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -1403,6 +1403,10 @@ handle_monitor_command (char *mon, char *own_buf)
         write_enn (own_buf);
       }
    }
+  else if (strcmp (mon, "set debug-file") == 0)
+    debug_set_output (nullptr);
+  else if (startswith (mon, "set debug-file "))
+    debug_set_output (mon + sizeof ("set debug-file ") - 1);
  else if (strcmp (mon, "help") == 0)
    monitor_show_help ();
  else if (strcmp (mon, "exit") == 0)
@@ -3649,6 +3653,8 @@ captured_main (int argc, char *argv[])
       }
      else if (strcmp (*next_arg, "--remote-debug") == 0)
       remote_debug = 1;
+      else if (startswith (*next_arg, "--debug-file="))
+       debug_set_output ((*next_arg) + sizeof ("--debug-file=") -1);
      else if (strcmp (*next_arg, "--disable-packet") == 0)
       {
         gdbserver_show_disableable (stdout);

Patch

diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index f410d026b8..1716466609 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -21332,8 +21332,11 @@  The @option{--debug} option tells @code{gdbserver} to display extra
 status information about the debugging process.
 @cindex @option{--remote-debug}, @code{gdbserver} option
 The @option{--remote-debug} option tells @code{gdbserver} to display
-remote protocol debug output.  These options are intended for
-@code{gdbserver} development and for bug reports to the developers.
+remote protocol debug output.
+@cindex @option{--debug-file}, @code{gdbserver} option
+The @option{--debug-file=filename} option tells @code{gdbserver} to
+write any debug output to the given file.  These options are intended
+for @code{gdbserver} development and for bug reports to the developers.
 
 @cindex @option{--debug-format}, @code{gdbserver} option
 The @option{--debug-format=option1[,option2,...]} option tells
@@ -21433,6 +21436,10 @@  Disable or enable general debugging messages.
 Disable or enable specific debugging messages associated with the remote
 protocol (@pxref{Remote Protocol}).
 
+@item monitor set debug-file filename
+@itemx monitor set debug-file
+Send any debug output to the given file, or to stderr.
+
 @item monitor set debug-format option1@r{[},option2,...@r{]}
 Specify additional text to add to debugging messages.
 Possible options are:
@@ -44563,6 +44570,11 @@  Instruct @code{gdbserver} to display remote protocol debug output.
 This option is intended for @code{gdbserver} development and for bug reports to
 the developers.
 
+@item --debug-file=filename
+Instruct @code{gdbserver} to send any debug output to the given file.
+This option is intended for @code{gdbserver} development and for bug reports to
+the developers.
+
 @item --debug-format=option1@r{[},option2,...@r{]}
 Instruct @code{gdbserver} to include extra information in each line
 of debugging output.
diff --git a/gdb/gdbserver/debug.c b/gdb/gdbserver/debug.c
index 7c4c77afe2..53647c1ea6 100644
--- a/gdb/gdbserver/debug.c
+++ b/gdb/gdbserver/debug.c
@@ -23,6 +23,9 @@ 
 int remote_debug = 0;
 #endif
 
+/* Output file for debugging.  Default to standard error.  */
+FILE *debug_file = stderr;
+
 /* Enable miscellaneous debugging output.  The name is historical - it
    was originally used to debug LinuxThreads support.  */
 int debug_threads;
@@ -30,6 +33,39 @@  int debug_threads;
 /* Include timestamps in debugging output.  */
 int debug_timestamp;
 
+#if !defined (IN_PROCESS_AGENT)
+
+/* See debug.h.  */
+
+void
+debug_set_output (const char *new_debug_file)
+{
+  /* Close any existing file and reset to standard error.  */
+  if (debug_file != stderr)
+    {
+      fclose (debug_file);
+    }
+  debug_file = stderr;
+
+  /* Catch empty filenames.  */
+  if (new_debug_file == nullptr || strlen (new_debug_file) == 0)
+    return;
+
+  FILE *fptr = fopen (new_debug_file, "w");
+
+  if (fptr == nullptr)
+    {
+      debug_printf ("Cannot open %s for writing. %s. Switching to stderr.\n",
+		    new_debug_file, strerror (errno));
+      return;
+    }
+
+  debug_file = fptr;
+  return;
+}
+
+#endif
+
 /* Print a debugging message.
    If the text begins a new line it is preceded by a timestamp.
    We don't get fancy with newline checking, we just check whether the
@@ -50,11 +86,11 @@  debug_vprintf (const char *format, va_list ap)
       seconds s = duration_cast<seconds> (now.time_since_epoch ());
       microseconds us = duration_cast<microseconds> (now.time_since_epoch ()) - s;
 
-      fprintf (stderr, "%ld.%06ld ", (long) s.count (), (long) us.count ());
+      fprintf (debug_file, "%ld.%06ld ", (long) s.count (), (long) us.count ());
     }
 #endif
 
-  vfprintf (stderr, format, ap);
+  vfprintf (debug_file, format, ap);
 
 #if !defined (IN_PROCESS_AGENT)
   if (*format)
@@ -69,7 +105,7 @@  debug_vprintf (const char *format, va_list ap)
 void
 debug_flush (void)
 {
-  fflush (stderr);
+  fflush (debug_file);
 }
 
 /* Notify the user that the code is entering FUNCTION_NAME.
diff --git a/gdb/gdbserver/debug.h b/gdb/gdbserver/debug.h
index c8d5e3365e..f65c91c9eb 100644
--- a/gdb/gdbserver/debug.h
+++ b/gdb/gdbserver/debug.h
@@ -21,6 +21,11 @@ 
 
 #if !defined (IN_PROCESS_AGENT)
 extern int remote_debug;
+
+/* Switch all debug output to DEBUG_FILE.  If DEBUG_FILE is nullptr or an
+   empty string, or if the file cannot be opened, then debug output is sent to
+   stderr.  */
+void debug_set_output (const char *debug_file);
 #endif
 
 extern int debug_threads;
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index 3f6c849dbc..36510ad1b2 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -1403,6 +1403,10 @@  handle_monitor_command (char *mon, char *own_buf)
 	  write_enn (own_buf);
 	}
     }
+  else if (strcmp (mon, "set debug-file") == 0)
+    debug_set_output (nullptr);
+  else if (startswith (mon, "set debug-file "))
+    debug_set_output (mon + sizeof ("set debug-file ") - 1);
   else if (strcmp (mon, "help") == 0)
     monitor_show_help ();
   else if (strcmp (mon, "exit") == 0)
@@ -3649,6 +3653,8 @@  captured_main (int argc, char *argv[])
 	}
       else if (strcmp (*next_arg, "--remote-debug") == 0)
 	remote_debug = 1;
+      else if (startswith (*next_arg, "--debug-file="))
+	debug_set_output ((*next_arg) + sizeof ("--debug-file=") -1);
       else if (strcmp (*next_arg, "--disable-packet") == 0)
 	{
 	  gdbserver_show_disableable (stdout);