From a7e559cc087b10b9ea337b58e52cc13964aae3fb Mon Sep 17 00:00:00 2001 From: Alan Hayward Date: Tue, 16 Apr 2019 10:37:47 +0100 Subject: [PATCH] gdbserver: Ensure all debug output uses debug functions All debug output needs to go via debug functions to ensure it writes to the correct output stream. gdb/ChangeLog: * nat/linux-waitpid.c (linux_debug): Call debug_vprintf. gdb/gdbserver/ChangeLog: * ax.c (ax_vdebug): Call debug_printf. * debug.c (debug_write): New function. * debug.h (debug_write): New declaration. * linux-low.c (sigchld_handler): Call debug_write. --- gdb/ChangeLog | 4 ++++ gdb/gdbserver/ChangeLog | 7 +++++++ gdb/gdbserver/ax.c | 4 ++++ gdb/gdbserver/debug.c | 9 +++++++++ gdb/gdbserver/debug.h | 3 +++ gdb/gdbserver/linux-low.c | 7 +++---- gdb/nat/linux-waitpid.c | 2 +- 7 files changed, 31 insertions(+), 5 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f8120db..2fb4b87 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2019-04-17 Alan Hayward + + * nat/linux-waitpid.c (linux_debug): Call debug_vprintf. + 2019-04-17 Jim Wilson Andrew Burgess diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index d3380d6..f8f600e 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,5 +1,12 @@ 2019-04-17 Alan Hayward + * ax.c (ax_vdebug): Call debug_printf. + * debug.c (debug_write): New function. + * debug.h (debug_write): New declaration. + * linux-low.c (sigchld_handler): Call debug_write. + +2019-04-17 Alan Hayward + * debug.c (debug_set_output): New function. (debug_vprintf): Send output to debug_file. (debug_flush): Likewise. diff --git a/gdb/gdbserver/ax.c b/gdb/gdbserver/ax.c index a16fba1..7b8df91 100644 --- a/gdb/gdbserver/ax.c +++ b/gdb/gdbserver/ax.c @@ -36,7 +36,11 @@ ax_vdebug (const char *fmt, ...) va_start (ap, fmt); vsprintf (buf, fmt, ap); +#ifdef IN_PROCESS_AGENT fprintf (stderr, PROG "/ax: %s\n", buf); +#else + debug_printf (PROG "/ax: %s\n", buf); +#endif va_end (ap); } diff --git a/gdb/gdbserver/debug.c b/gdb/gdbserver/debug.c index d80cd52..a1cf5db 100644 --- a/gdb/gdbserver/debug.c +++ b/gdb/gdbserver/debug.c @@ -130,3 +130,12 @@ do_debug_exit (const char *function_name) if (function_name != NULL) debug_printf ("<<<< exiting %s\n", function_name); } + +/* See debug.h. */ + +size_t +debug_write (const void *buf, size_t nbyte) +{ + int fd = fileno (debug_file); + return write (fd, buf, nbyte); +} diff --git a/gdb/gdbserver/debug.h b/gdb/gdbserver/debug.h index f65c91c..29e58ad 100644 --- a/gdb/gdbserver/debug.h +++ b/gdb/gdbserver/debug.h @@ -35,6 +35,9 @@ void debug_flush (void); void do_debug_enter (const char *function_name); void do_debug_exit (const char *function_name); +/* Async signal safe debug output function that calls write directly. */ +size_t debug_write (const void *buf, size_t nbyte); + /* These macros are for use in major functions that produce a lot of debugging output. They help identify in the mass of debugging output when these functions enter and exit. debug_enter is intended to be diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 168f4b2..917b1c2 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -6185,10 +6185,9 @@ sigchld_handler (int signo) { do { - /* fprintf is not async-signal-safe, so call write - directly. */ - if (write (2, "sigchld_handler\n", - sizeof ("sigchld_handler\n") - 1) < 0) + /* Use the async signal safe debug function. */ + if (debug_write ("sigchld_handler\n", + sizeof ("sigchld_handler\n") - 1) < 0) break; /* just ignore */ } while (0); } diff --git a/gdb/nat/linux-waitpid.c b/gdb/nat/linux-waitpid.c index e31c088..a7d11ab 100644 --- a/gdb/nat/linux-waitpid.c +++ b/gdb/nat/linux-waitpid.c @@ -42,7 +42,7 @@ linux_debug (const char *format, ...) { va_list args; va_start (args, format); - vfprintf (stderr, format, args); + debug_vprintf (format, args); va_end (args); } #endif -- 2.7.4