| /* Debugging routines for the remote server for GDB. |
| Copyright (C) 2014 Free Software Foundation, Inc. |
| |
| This file is part of GDB. |
| |
| 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/>. */ |
| |
| #include "server.h" |
| #include <sys/time.h> |
| |
| /* Enable miscellaneous debugging output. The name is historical - it |
| was originally used to debug LinuxThreads support. */ |
| int debug_threads; |
| |
| /* Include timestamps in debugging output. */ |
| int debug_timestamp; |
| |
| /* Print a debugging message. |
| If the text begins a new line it is preceded by a timestamp, if the |
| system has gettimeofday. |
| We don't get fancy with newline checking, we just check whether the |
| previous call ended with "\n". */ |
| |
| void |
| debug_vprintf (const char *format, va_list ap) |
| { |
| #if !defined (IN_PROCESS_AGENT) |
| /* N.B. Not thread safe, and can't be used, as is, with IPA. */ |
| static int new_line = 1; |
| |
| if (debug_timestamp && new_line) |
| { |
| struct timeval tm; |
| |
| gettimeofday (&tm, NULL); |
| |
| /* If gettimeofday doesn't exist, and as a portability solution it has |
| been replaced with, e.g., time, then it doesn't make sense to print |
| the microseconds field. Is there a way to check for that? */ |
| fprintf (stderr, "%ld:%06ld ", (long) tm.tv_sec, (long) tm.tv_usec); |
| } |
| #endif |
| |
| vfprintf (stderr, format, ap); |
| |
| #if !defined (IN_PROCESS_AGENT) |
| if (*format) |
| new_line = format[strlen (format) - 1] == '\n'; |
| #endif |
| } |
| |
| /* Flush debugging output. |
| This is called, for example, when starting an inferior to ensure all debug |
| output thus far appears before any inferior output. */ |
| |
| void |
| debug_flush (void) |
| { |
| fflush (stderr); |
| } |
| |
| /* Notify the user that the code is entering FUNCTION_NAME. |
| FUNCTION_NAME is the name of the calling function, or NULL if unknown. |
| |
| This is intended to be called via the debug_enter macro. */ |
| |
| void |
| do_debug_enter (const char *function_name) |
| { |
| if (function_name != NULL) |
| debug_printf (">>>> entering %s\n", function_name); |
| } |
| |
| /* Notify the user that the code is exiting FUNCTION_NAME. |
| FUNCTION_NAME is the name of the calling function, or NULL if unknown. |
| |
| This is intended to be called via the debug_exit macro. */ |
| |
| void |
| do_debug_exit (const char *function_name) |
| { |
| if (function_name != NULL) |
| debug_printf ("<<<< exiting %s\n", function_name); |
| } |