From: Alan Hayward Date: Tue, 16 Apr 2019 09:37:47 +0000 (+0100) Subject: gdbserver: Ensure all debug output uses debug functions X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a7e559cc087b10b9ea337b58e52cc13964aae3fb;p=binutils-gdb.git 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f8120db4c74..2fb4b872448 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 d3380d61452..f8f600e46d2 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,10 @@ +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. diff --git a/gdb/gdbserver/ax.c b/gdb/gdbserver/ax.c index a16fba1ccd7..7b8df917492 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 d80cd525405..a1cf5dbf7aa 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 f65c91c9ebc..29e58ad8a48 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 168f4b2abc2..917b1c290bc 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 e31c088f66d..a7d11ab8d32 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