mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-21 04:42:53 +08:00
2189c31265
This is the next in the new-style debug macro series. For this one, I decided to omit the function name from the "Sending packet" / "Packet received" kind of prints, just because it's not very useful in that context and hinders readability more than anything else. This is completely arbitrary. This is with: [remote] putpkt_binary: Sending packet: $qTStatus#49... [remote] getpkt_or_notif_sane_1: Packet received: T0;tnotrun:0;tframes:0;tcreated:0;tfree:500000;tsize:500000;circular:0;disconn:0;starttime:0;stoptime:0;username:;notes:: and without: [remote] Sending packet: $qTStatus#49... [remote] Packet received: T0;tnotrun:0;tframes:0;tcreated:0;tfree:500000;tsize:500000;circular:0;disconn:0;starttime:0;stoptime:0;username:;notes:: A difference is that previously, the query packet and its reply would be printed on the same line, like this: Sending packet: $qTStatus#49...Packet received: T0;tnotrun:0;tframes:0;tcreated:0;tfree:500000;tsize:500000;circular:0;disconn:0;starttime:0;stoptime:0;username:;notes:: Now, they are printed on two lines, since each remote_debug_printf{,_nofunc} prints its own complete message including an end of line. It's probably a matter of taste, but I prefer the two-line version, it's easier to follow, especially when the query packet is long. As a result, lib/range-stepping-support.exp needs to be updated, as it currently expects the vCont packet and the reply to be on the same line. I think it's sufficient in that context to just expect the vCont packet and not the reply, since the goal is just to count how many vCont;r GDB sends. gdb/ChangeLog: * remote.h (remote_debug_printf): New. (remote_debug_printf_nofunc): New. (REMOTE_SCOPED_DEBUG_ENTER_EXIT): New. * remote.c: Use above macros throughout file. gdbsupport/ChangeLog: * common-debug.h (debug_prefixed_printf_cond_nofunc): New. * common-debug.c (debug_prefixed_vprintf): Handle a nullptr func. gdb/testsuite/ChangeLog: * lib/range-stepping-support.exp (exec_cmd_expect_vCont_count): Adjust to "set debug remote" changes. Change-Id: Ica6dead50d3f82e855c7d763f707cef74bed9fee
158 lines
5.1 KiB
C++
158 lines
5.1 KiB
C++
/* Declarations for debug printing functions.
|
|
|
|
Copyright (C) 2014-2021 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/>. */
|
|
|
|
#ifndef COMMON_COMMON_DEBUG_H
|
|
#define COMMON_COMMON_DEBUG_H
|
|
|
|
/* Set to true to enable debugging of hardware breakpoint/
|
|
watchpoint support code. */
|
|
|
|
extern bool show_debug_regs;
|
|
|
|
/* Print a formatted message to the appropriate channel for
|
|
debugging output for the client. */
|
|
|
|
extern void debug_printf (const char *format, ...)
|
|
ATTRIBUTE_PRINTF (1, 2);
|
|
|
|
/* Print a formatted message to the appropriate channel for
|
|
debugging output for the client. This function must be
|
|
provided by the client. */
|
|
|
|
extern void debug_vprintf (const char *format, va_list ap)
|
|
ATTRIBUTE_PRINTF (1, 0);
|
|
|
|
/* Print a debug statement prefixed with the module and function name, and
|
|
with a newline at the end. */
|
|
|
|
extern void ATTRIBUTE_PRINTF (3, 4) debug_prefixed_printf
|
|
(const char *module, const char *func, const char *format, ...);
|
|
|
|
/* Print a debug statement prefixed with the module and function name, and
|
|
with a newline at the end. */
|
|
|
|
extern void ATTRIBUTE_PRINTF (3, 0) debug_prefixed_vprintf
|
|
(const char *module, const char *func, const char *format, va_list args);
|
|
|
|
/* Helper to define "_debug_print" macros.
|
|
|
|
DEBUG_ENABLED_COND is an expression that evaluates to true if the debugging
|
|
statement is enabled and should be printed.
|
|
|
|
The other arguments, as well as the name of the current function, are
|
|
forwarded to debug_prefixed_printf. */
|
|
|
|
#define debug_prefixed_printf_cond(debug_enabled_cond, module, fmt, ...) \
|
|
do \
|
|
{ \
|
|
if (debug_enabled_cond) \
|
|
debug_prefixed_printf (module, __func__, fmt, ##__VA_ARGS__); \
|
|
} \
|
|
while (0)
|
|
|
|
#define debug_prefixed_printf_cond_nofunc(debug_enabled_cond, module, fmt, ...) \
|
|
do \
|
|
{ \
|
|
if (debug_enabled_cond) \
|
|
debug_prefixed_printf (module, nullptr, fmt, ##__VA_ARGS__); \
|
|
} \
|
|
while (0)
|
|
|
|
/* Nesting depth of scoped_debug_start_end objects. */
|
|
|
|
extern int debug_print_depth;
|
|
|
|
/* Print a message on construction and destruction, to denote the start and end
|
|
of an operation. Increment DEBUG_PRINT_DEPTH on construction and decrement
|
|
it on destruction, such that nested debug statements will be printed with
|
|
an indent and appear "inside" this one. */
|
|
|
|
struct scoped_debug_start_end
|
|
{
|
|
/* DEBUG_ENABLED is a reference to a variable that indicates whether debugging
|
|
is enabled, so if the debug statements should be printed. Is is read
|
|
separately at construction and destruction, such that the start statement
|
|
could be printed but not the end statement, or vice-versa.
|
|
|
|
MODULE and FUNC are forwarded to debug_prefixed_printf.
|
|
|
|
START_MSG and END_MSG are the statements to print on construction and
|
|
destruction, respectively. */
|
|
|
|
scoped_debug_start_end (bool &debug_enabled, const char *module,
|
|
const char *func, const char *start_msg,
|
|
const char *end_msg)
|
|
: m_debug_enabled (debug_enabled),
|
|
m_module (module),
|
|
m_func (func),
|
|
m_end_msg (end_msg)
|
|
{
|
|
if (m_debug_enabled)
|
|
{
|
|
debug_prefixed_printf (m_module, m_func, "%s", start_msg);
|
|
++debug_print_depth;
|
|
m_must_decrement_print_depth = true;
|
|
}
|
|
}
|
|
|
|
DISABLE_COPY_AND_ASSIGN (scoped_debug_start_end);
|
|
|
|
~scoped_debug_start_end ()
|
|
{
|
|
if (m_must_decrement_print_depth)
|
|
{
|
|
gdb_assert (debug_print_depth > 0);
|
|
--debug_print_depth;
|
|
}
|
|
|
|
if (m_debug_enabled)
|
|
{
|
|
debug_prefixed_printf (m_module, m_func, "%s", m_end_msg);
|
|
}
|
|
}
|
|
|
|
private:
|
|
bool &m_debug_enabled;
|
|
const char *m_module;
|
|
const char *m_func;
|
|
const char *m_end_msg;
|
|
|
|
/* This is used to handle the case where debugging is enabled during
|
|
construction but not during destruction, or vice-versa. We want to make
|
|
sure there are as many increments are there are decrements. */
|
|
|
|
bool m_must_decrement_print_depth = false;
|
|
};
|
|
|
|
/* Helper to define a module-specific start/end debug macro. */
|
|
|
|
#define scoped_debug_start_end(debug_enabled, module, msg) \
|
|
scoped_debug_start_end CONCAT(scoped_debug_start_end, __LINE__) \
|
|
(debug_enabled, module, __func__, "start: " msg, "end: " msg)
|
|
|
|
/* Helper to define a module-specific enter/exit debug macro. This is a special
|
|
case of `scoped_debug_start_end` where the start and end messages are "enter"
|
|
and "exit", to denote entry and exit of a function. */
|
|
|
|
#define scoped_debug_enter_exit(debug_enabled, module) \
|
|
scoped_debug_start_end CONCAT(scoped_debug_start_end, __LINE__) \
|
|
(debug_enabled, module, __func__, "enter", "exit")
|
|
|
|
#endif /* COMMON_COMMON_DEBUG_H */
|