While trying to create skips for libstdc++, I found myself debugging GDB
quite a bit, mostly to find out what the exact function name to match
is. I thought it would make sense to have this information as debug
output.
This patch adds "set debug skip on|off".
gdb/ChangeLog:
* skip.c (debug_skip): New variable.
(skiplist_entry::do_skip_file_p): Add debug output.
(skiplist_entry::do_skip_gfile_p): Likewise.
(skiplist_entry::skip_function_p): Likewise.
(_initialize_step_skip): Create debug command.
* NEWS: Mention set/show debug skip.
gdb/doc/ChangeLog:
* gdb.texinfo (Skipping Over Functions and Files): Document
set/show debug skip.
+2018-09-12 Simon Marchi <simon.marchi@ericsson.com>
+
+ * skip.c (debug_skip): New variable.
+ (skiplist_entry::do_skip_file_p): Add debug output.
+ (skiplist_entry::do_skip_gfile_p): Likewise.
+ (skiplist_entry::skip_function_p): Likewise.
+ (_initialize_step_skip): Create debug command.
+ * NEWS: Mention set/show debug skip.
+
2018-09-11 Xavier Roirand <roirand@adacore.com>
* darwin-nat.c (should_disable_startup_with_shell):
2018-09-11 Xavier Roirand <roirand@adacore.com>
* darwin-nat.c (should_disable_startup_with_shell):
C++ compile feature. Commands have no effect while compiliong
for other languages.
C++ compile feature. Commands have no effect while compiliong
for other languages.
+set debug skip
+show debug skip
+ Control whether debug output about files/functions skipping is
+ displayed.
+
frame apply [all | COUNT | -COUNT | level LEVEL...] [FLAG]... COMMAND
Apply a command to some frames.
FLAG arguments allow to control what output to produce and how to handle
frame apply [all | COUNT | -COUNT | level LEVEL...] [FLAG]... COMMAND
Apply a command to some frames.
FLAG arguments allow to control what output to produce and how to handle
+2018-09-12 Simon Marchi <simon.marchi@ericsson.com>
+
+ * gdb.texinfo (Skipping Over Functions and Files): Document
+ set/show debug skip.
+
2018-09-10 Tom Tromey <tom@tromey.com>
* python.texi (Frames In Python, Blocks In Python)
2018-09-10 Tom Tromey <tom@tromey.com>
* python.texi (Frames In Python, Blocks In Python)
Disable the specified skip(s). If @var{range} is not specified, disable all
skips.
Disable the specified skip(s). If @var{range} is not specified, disable all
skips.
+@kindex set debug skip
+@item set debug skip @r{[}on|off@r{]}
+Set whether to print the debug output about skipping files and functions.
+
+@kindex show debug skip
+@item show debug skip
+Show whether the debug output about skipping files and functions is printed.
+
#include "common/gdb_optional.h"
#include <list>
#include "common/gdb_optional.h"
#include <list>
+/* True if we want to print debug printouts related to file/function
+ skipping. */
+static int debug_skip = 0;
+
class skiplist_entry
{
public:
class skiplist_entry
{
public:
bool
skiplist_entry::do_skip_file_p (const symtab_and_line &function_sal) const
{
bool
skiplist_entry::do_skip_file_p (const symtab_and_line &function_sal) const
{
+ if (debug_skip)
+ fprintf_unfiltered (gdb_stdlog,
+ "skip: checking if file %s matches non-glob %s...",
+ function_sal.symtab->filename, m_file.c_str ());
+
+ bool result;
+
/* Check first sole SYMTAB->FILENAME. It may not be a substring of
symtab_to_fullname as it may contain "./" etc. */
if (compare_filenames_for_search (function_sal.symtab->filename,
m_file.c_str ()))
/* Check first sole SYMTAB->FILENAME. It may not be a substring of
symtab_to_fullname as it may contain "./" etc. */
if (compare_filenames_for_search (function_sal.symtab->filename,
m_file.c_str ()))
/* Before we invoke realpath, which can get expensive when many
files are involved, do a quick comparison of the basenames. */
/* Before we invoke realpath, which can get expensive when many
files are involved, do a quick comparison of the basenames. */
- if (!basenames_may_differ
- && filename_cmp (lbasename (function_sal.symtab->filename),
- lbasename (m_file.c_str ())) != 0)
- return false;
+ else if (!basenames_may_differ
+ && filename_cmp (lbasename (function_sal.symtab->filename),
+ lbasename (m_file.c_str ())) != 0)
+ result = false;
+ else
+ {
+ /* Note: symtab_to_fullname caches its result, thus we don't have to. */
+ const char *fullname = symtab_to_fullname (function_sal.symtab);
- /* Note: symtab_to_fullname caches its result, thus we don't have to. */
- {
- const char *fullname = symtab_to_fullname (function_sal.symtab);
+ result = compare_filenames_for_search (fullname, m_file.c_str ());
+ }
- if (compare_filenames_for_search (fullname, m_file.c_str ()))
- return true;
- }
+ if (debug_skip)
+ fprintf_unfiltered (gdb_stdlog, result ? "yes.\n" : "no.\n");
}
bool
skiplist_entry::do_skip_gfile_p (const symtab_and_line &function_sal) const
{
}
bool
skiplist_entry::do_skip_gfile_p (const symtab_and_line &function_sal) const
{
+ if (debug_skip)
+ fprintf_unfiltered (gdb_stdlog,
+ "skip: checking if file %s matches glob %s...",
+ function_sal.symtab->filename, m_file.c_str ());
+
+ bool result;
+
/* Check first sole SYMTAB->FILENAME. It may not be a substring of
symtab_to_fullname as it may contain "./" etc. */
if (gdb_filename_fnmatch (m_file.c_str (), function_sal.symtab->filename,
FNM_FILE_NAME | FNM_NOESCAPE) == 0)
/* Check first sole SYMTAB->FILENAME. It may not be a substring of
symtab_to_fullname as it may contain "./" etc. */
if (gdb_filename_fnmatch (m_file.c_str (), function_sal.symtab->filename,
FNM_FILE_NAME | FNM_NOESCAPE) == 0)
/* Before we invoke symtab_to_fullname, which is expensive, do a quick
comparison of the basenames.
Note that we assume that lbasename works with glob-style patterns.
If the basename of the glob pattern is something like "*.c" then this
isn't much of a win. Oh well. */
/* Before we invoke symtab_to_fullname, which is expensive, do a quick
comparison of the basenames.
Note that we assume that lbasename works with glob-style patterns.
If the basename of the glob pattern is something like "*.c" then this
isn't much of a win. Oh well. */
- if (!basenames_may_differ
+ else if (!basenames_may_differ
&& gdb_filename_fnmatch (lbasename (m_file.c_str ()),
lbasename (function_sal.symtab->filename),
FNM_FILE_NAME | FNM_NOESCAPE) != 0)
&& gdb_filename_fnmatch (lbasename (m_file.c_str ()),
lbasename (function_sal.symtab->filename),
FNM_FILE_NAME | FNM_NOESCAPE) != 0)
+ result = false;
+ else
+ {
+ /* Note: symtab_to_fullname caches its result, thus we don't have to. */
+ const char *fullname = symtab_to_fullname (function_sal.symtab);
- /* Note: symtab_to_fullname caches its result, thus we don't have to. */
- {
- const char *fullname = symtab_to_fullname (function_sal.symtab);
+ result = compare_glob_filenames_for_search (fullname, m_file.c_str ());
+ }
- if (compare_glob_filenames_for_search (fullname, m_file.c_str ()))
- return true;
- }
+ if (debug_skip)
+ fprintf_unfiltered (gdb_stdlog, result ? "yes.\n" : "no.\n");
if (m_function.empty ())
return false;
if (m_function.empty ())
return false;
if (m_function_is_regexp)
{
if (m_function_is_regexp)
{
+ if (debug_skip)
+ fprintf_unfiltered (gdb_stdlog,
+ "skip: checking if function %s matches regex %s...",
+ function_name, m_function.c_str ());
+
gdb_assert (m_compiled_function_regexp);
gdb_assert (m_compiled_function_regexp);
- return (m_compiled_function_regexp->exec (function_name, 0, NULL, 0)
- == 0);
+ result
+ = (m_compiled_function_regexp->exec (function_name, 0, NULL, 0) == 0);
- return strcmp_iw (function_name, m_function.c_str ()) == 0;
+ {
+ if (debug_skip)
+ fprintf_unfiltered (gdb_stdlog,
+ ("skip: checking if function %s matches non-regex "
+ "%s..."),
+ function_name, m_function.c_str ());
+ result = (strcmp_iw (function_name, m_function.c_str ()) == 0);
+ }
+
+ if (debug_skip)
+ fprintf_unfiltered (gdb_stdlog, result ? "yes.\n" : "no.\n");
+
+ return result;
The \"Type\" column indicates one of:\n\
\tfile - ignored file\n\
\tfunction - ignored function"));
The \"Type\" column indicates one of:\n\
\tfile - ignored file\n\
\tfunction - ignored function"));
+
+ add_setshow_boolean_cmd ("skip", class_maintenance,
+ &debug_skip, _("\
+Set whether to print the debug output about skipping files and functions."),
+ _("\
+Show whether the debug output about skipping files and functions is printed"),
+ _("\
+When non-zero, debug output about skipping files and functions is displayed."),
+ NULL, NULL,
+ &setdebuglist, &showdebuglist);