Re: [patch] GDB 7.2: new feature for "backtrace" that cuts path to file (remain filename)

Jan Kratochvil
2012-03-14T16:27:34Z

Hi,

as I see ongoing reviews and I still work on the testcase posting this part.

This is not ready for check-in as is, there will be needed mor eoptions for
filename-display, which will be visible from the testcase and which was
already discussed here in the list.

Thanks,
Jan

On Sat, 10 Mar 2012 21:14:43 +0100, iam ahal wrote:
> diff -rup gdb-7.4-orig/gdb/doc/gdb.texinfo gdb-7.4/gdb/doc/gdb.texinfo
> --- gdb-7.4-orig/gdb/doc/gdb.texinfo 2012-01-06 08:43:35.000000000 +0400
> +++ gdb-7.4/gdb/doc/gdb.texinfo 2012-03-10 23:10:42.432243654 +0400
> @@ -6191,6 +6191,26 @@ unlimited.
> Display the current limit on backtrace levels.
> @end table
>
> +If backtraces isn't easy to read due to a long absolute filename path recorded and
> +you just want to see only a basename or a relative filename path, you can change this
> +behaviour:

Lines longer than 80 characters.

> +
> +@table @code
> +@item set backtrace filename-display
> +@itemx set backtrace filename-display as-recorded
> +@cindex backtrace filename-display
> +Display a filename recorded at the compilation time. This is the default.
> +
> +@item set backtrace filename-display basename
> +Display only basename of a filename.
> +
> +@item set backtrace filename-display relative
> +Display a filename without the compilation directory part.
> +
> +@item show backtrace filename-display
> +Show the current way to display a filename in backtraces.
> +@end table
> +
> @node Selection
> @section Selecting a Frame
>
> diff -rup gdb-7.4-orig/gdb/frame.c gdb-7.4/gdb/frame.c
> --- gdb-7.4-orig/gdb/frame.c 2012-01-06 08:43:12.000000000 +0400
> +++ gdb-7.4/gdb/frame.c 2012-03-10 23:10:36.060243841 +0400
> @@ -44,6 +44,7 @@
> #include "block.h"
> #include "inline-frame.h"
> #include "tracepoint.h"
> +#include "filenames.h"
>
> static struct frame_info *get_prev_frame_1 (struct frame_info *this_frame);
> static struct frame_info *get_prev_frame_raw (struct frame_info *this_frame);
> @@ -135,6 +136,18 @@ struct frame_info
> sufficient for now. */
> static struct frame_info *frame_stash = NULL;
>
> +/* Possible values of 'set backtrace filename-display'. */
> +static const char filename_display_as_recorded[] = "as-recorded";
> +static const char filename_display_basename[] = "basename";
> +static const char filename_display_relative_directory[] = "relative";
> +
> +static const char *filename_display_kind_names[] = {

more const:
static const char *const filename_display_kind_names[] = {

[obv] Code cleanup: add_setshow_enum_cmd: Make 1440 bytes of data segment read-only
http://sourceware.org/ml/gdb-patches/2012-01/msg00973.html

> + filename_display_as_recorded,
> + filename_display_basename,
> + filename_display_relative_directory,
> + NULL
> +};
> +
> /* Add the following FRAME to the frame stash. */
>
> static void
> @@ -207,6 +220,16 @@ show_backtrace_limit (struct ui_file *fi
> value);
> }
>
> +static const char *filename_display_string = filename_display_as_recorded;
> +
> +static void
> +show_filename_display_string (struct ui_file *file, int from_tty,
> + struct cmd_list_element *c, const char *value)
> +{
> + fprintf_filtered (file,
> + _("A filename is displayed in backtrace as \"%s\".\n"),
> + value);
> +}
>
> static void
> fprint_field (struct ui_file *file, const char *name, int p, CORE_ADDR addr)
> @@ -2118,6 +2141,42 @@ find_frame_sal (struct frame_info *frame
> (*sal) = find_pc_line (pc, notcurrent);
> }
>
> +/* See commentary in frame.h. */
> +
> +const char *
> +get_filename_display_from_sal (const struct symtab_and_line *sal)
> +{
> + const char *filename = sal->symtab->filename;
> + const char *dirname = sal->symtab->dirname;
> + size_t dlen = dirname ? strlen (dirname) : 0;
> +
> + if (filename == NULL)
> + {
> + return NULL;
> + }

Excessive { }.

> + else if (filename_display_string == filename_display_basename)
> + {
> + return lbasename (filename);
> + }

Excessive { }.

> + else if (filename_display_string == filename_display_relative_directory &&
> + dirname && dlen && dlen <= strlen (filename) &&
> + !filename_ncmp (filename, dirname, dlen))

Operators should be leading, not trailing on the line. And matching
components must match their right column from the preceding line:

else if (filename_display_string == filename_display_relative_directory
&& dirname && dlen && dlen <= strlen (filename)
&& !filename_ncmp (filename, dirname, dlen))

> + {
> + const char *start = filename + dlen;
> + const char *result = start;
> +
> + while (IS_DIR_SEPARATOR (*result))
> + result++;
> +
> + if (IS_DIR_SEPARATOR (dirname[dlen - 1]))
> + return result;
> + else
> + return result == start ? filename : result;
> + }
> +
> + return filename;
> +}
> +
> /* Per "frame.h", return the ``address'' of the frame. Code should
> really be using get_frame_id(). */
> CORE_ADDR
> @@ -2477,6 +2536,21 @@ Zero is unlimited."),
> &set_backtrace_cmdlist,
> &show_backtrace_cmdlist);
>
> + add_setshow_enum_cmd ("filename-display", class_obscure,
> + filename_display_kind_names,
> + &filename_display_string, _("\
> +Set how to display filename in backtraces."), _("\
> +Show how to display filename in backtraces."), _("\
> +filename-display can be:\n\
> + as-recorded - display a filename recorded at the compilation time\n\
> + basename - display only basename of a filename\n\
> + relative - display a filename without the compilation directory part\n\

Lines longer than 80 characters.

> +By default, as-recorded filename is displayed."),
> + NULL,
> + show_filename_display_string,
> + &set_backtrace_cmdlist,
> + &show_backtrace_cmdlist);
> +
> /* Debug this files internals. */
> add_setshow_zinteger_cmd ("frame", class_maintenance, &frame_debug, _("\
> Set frame debugging."), _("\
> diff -rup gdb-7.4-orig/gdb/frame.h gdb-7.4/gdb/frame.h
> --- gdb-7.4-orig/gdb/frame.h 2012-01-06 08:43:12.000000000 +0400
> +++ gdb-7.4/gdb/frame.h 2012-03-10 23:13:36.452238567 +0400
> @@ -353,6 +353,12 @@ extern int get_frame_func_if_available (
> extern void find_frame_sal (struct frame_info *frame,
> struct symtab_and_line *sal);
>
> +/* Returns either 'as recorded' filename or basename or filename
> + without the compile directory part.
> + It depends on 'set backtrace filename-display' value. */
> +
> +extern const char *get_filename_display_from_sal (const struct symtab_and_line *sal);

Lines longer than 80 characters.

> +
> /* Set the current source and line to the location given by frame
> FRAME, if possible. When CENTER is true, adjust so the relevant
> line is in the center of the next 'list'. */
> diff -rup gdb-7.4-orig/gdb/stack.c gdb-7.4/gdb/stack.c
> --- gdb-7.4-orig/gdb/stack.c 2012-01-06 08:43:31.000000000 +0400
> +++ gdb-7.4/gdb/stack.c 2012-03-10 22:17:18.628337327 +0400
> @@ -1173,11 +1173,16 @@ print_frame (struct frame_info *frame, i
> ui_out_text (uiout, ")");
> if (sal.symtab && sal.symtab->filename)
> {
> + const char *filename_display = get_filename_display_from_sal (&sal);
> +
> + if (filename_display == NULL)
> + filename_display = sal.symtab->filename;
> +
> annotate_frame_source_begin ();
> ui_out_wrap_hint (uiout, " ");
> ui_out_text (uiout, " at ");
> annotate_frame_source_file ();
> - ui_out_field_string (uiout, "file", sal.symtab->filename);
> + ui_out_field_string (uiout, "file", filename_display);
> if (ui_out_is_mi_like_p (uiout))
> {
> const char *fullname = symtab_to_fullname (sal.symtab);