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

iam ahal
2011-12-04T15:52:39Z

[-- Attachment #1: Type: text/plain, Size: 1124 bytes --]

To Tom Tromey, Doug Evans:

Sorry for a late response, unfortunately, I've been busy at work.
Thanks for the review. I've checked and corrected the patch by your
comments.
See changed files in the attachment.

On Wed, Nov 2, 2011 at 11:05 PM, Tom Tromey <tromey@redhat.com> wrote:
> I don't recall whether this has had a doc review yet.

You have not reviewed a text for this feature in the documentation.

> I think the patch should also include a NEWS entry.

I don't have an idea how to fill out a NEWS entry. It has descriptions
only for release versions.

On Thu, Nov 3, 2011 at 2:53 AM, Doug Evans <dje@google.com> wrote:
> If filename_display is NULL it's because sal.symtab->filename was NULL.
> [right?]
> This is confusing.
> I suggest removing this code:
>
> + if (filename_display == NULL)
> + filename_display = sal.symtab->filename;

I leave this check because I suppose that we don't need to know how to
work this function.
So I don't need to know when it can return NULL.
It's reliable in a sense that everybody can modify this function (e.g.
I can add new cases when it returns NULL).

~Eldar.

[-- Attachment #2: gdb-filename-display.patch --]
[-- Type: text/x-patch, Size: 6089 bytes --]

diff -rup gdb-7.3.1-orig/gdb/doc/gdb.texinfo gdb-7.3.1/gdb/doc/gdb.texinfo
--- gdb-7.3.1-orig/gdb/doc/gdb.texinfo 2011-09-04 21:10:37.000000000 +0400
+++ gdb-7.3.1/gdb/doc/gdb.texinfo 2011-12-04 18:16:03.182293844 +0400
@@ -6052,6 +6052,19 @@ unlimited.

@item show backtrace limit
Display the current limit on backtrace levels.
+
+@item set backtrace filename-display
+@itemx set backtrace filename-display full
+Display a full filename. This is the default.
+
+@item set backtrace filename-display basename
+Display only basename of a filename.
+
+@item set backtrace filename-display without-compilation-directory
+Display a filename without the compilation directory part.
+
+@item show backtrace filename-display
+Display the current way to display a filename.
@end table

@node Selection
diff -rup gdb-7.3.1-orig/gdb/frame.c gdb-7.3.1/gdb/frame.c
--- gdb-7.3.1-orig/gdb/frame.c 2011-03-18 21:52:30.000000000 +0300
+++ gdb-7.3.1/gdb/frame.c 2011-12-04 18:20:23.594286230 +0400
@@ -45,6 +45,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);
@@ -136,6 +137,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_full[] = "full";
+static const char filename_display_basename[] = "basename";
+static const char filename_display_without_comp_directory[] = "without-compilation-directory";
+
+static const char *filename_display_kind_names[] = {
+ filename_display_full,
+ filename_display_basename,
+ filename_display_without_comp_directory,
+ NULL
+};
+
/* Add the following FRAME to the frame stash. */

static void
@@ -208,6 +221,16 @@ show_backtrace_limit (struct ui_file *fi
value);
}

+static const char *filename_display_string = filename_display_full;
+
+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)
@@ -2113,6 +2136,41 @@ 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 (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;
+ }
+ else if (filename_display_string == filename_display_basename)
+ {
+ return lbasename (filename);
+ }
+ else if (filename_display_string == filename_display_without_comp_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
@@ -2484,6 +2542,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 a way how to display filename."), _("\
+Show a way how to display filename."), _("\
+filename-display can be:\n\
+ full - display a full filename, this is the default\n\
+ basename - display only basename of a filename\n\
+ without-compilation-directory - display a filename without the compilation directory part\n\
+By default, full 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.3.1-orig/gdb/frame.h gdb-7.3.1/gdb/frame.h
--- gdb-7.3.1-orig/gdb/frame.h 2011-03-18 21:52:30.000000000 +0300
+++ gdb-7.3.1/gdb/frame.h 2011-12-04 17:22:55.998387032 +0400
@@ -352,6 +352,12 @@ extern int get_frame_func_if_available (
extern void find_frame_sal (struct frame_info *frame,
struct symtab_and_line *sal);

+/* Returns either full filename or basename or filename
+ without compile directory part.
+ It depends on 'set backtrace filename-display' value. */
+
+extern const char *get_filename_display_from_sal (struct symtab_and_line *sal);
+
/* 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.3.1-orig/gdb/stack.c gdb-7.3.1/gdb/stack.c
--- gdb-7.3.1-orig/gdb/stack.c 2011-03-18 21:48:56.000000000 +0300
+++ gdb-7.3.1/gdb/stack.c 2011-12-04 17:31:30.194371998 +0400
@@ -835,11 +835,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);

[-- Attachment #3: ChangeLog --]
[-- Type: application/octet-stream, Size: 796 bytes --]

2011-10-30 Eldar Gaynetdinov <hal9000ed2k@gmail.com>

Add a new variable that controls a way in which filenames in
backtraces is displayed.
* frame.c: Added including of a header file.
(filename_display_full): New global variable.
(filename_display_basename): New global variable.
(filename_display_without_comp_directory): New global variable.
(filename_display_kind_names): New global array.
(show_filename_display_string): New function.
(get_filename_display_from_sal): New function.
(_initialize_frame): Added initialization of 'filename-display'
variable.
* frame.h (get_filename_display_from_sal): Added declaration.
* stack.c (print_frame): Added new variable and calling of a new
function and condition with this variable. Changed third argument of
calling of a function.

[-- Attachment #4: ChangeLog-doc --]
[-- Type: application/octet-stream, Size: 166 bytes --]

2011-10-30 Eldar Gaynetdinov <hal9000ed2k@gmail.com>

* gdb.texinfo (Backtrace): Added description of 'filename-display'
variable in 'set/show backtrace' section.