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

iam ahal
2012-03-10T20:15:10Z

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

First of all, I'm sorry for a late response (again). Fortunately, at
last, I've found free time at my weekend.
Thanks for the review since my last message.

To Eli Zaretskii, Tom Tromey, Pedro Alves, Doug Evans

I've tried carefully to fix documentation and a little piece of code.
Also, I've added NEWS entry.
Please, check this out.

To Jan Kratochvil

It would be great if you write.

To Tom Tromey

Copyright assignment has been done. As you wrote at 12.07.11 this
patch was almost done.
I think I get closer.

Thank in advance.

[-- Attachment #2: 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 #3: 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.

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

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:
+
+@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[] = {
+ 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;
+ }
+ else if (filename_display_string == filename_display_basename)
+ {
+ return lbasename (filename);
+ }
+ 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\
+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);
+
/* 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);

[-- Attachment #5: NEWS --]
[-- Type: application/octet-stream, Size: 172 bytes --]

* New options

set backtrace filename-display as-recorded|basename|relative
show backtrace filename-display
Control a way in which a filename is displayed in backtraces.