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

iam ahal
2011-07-03T16:35:13Z

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

I've read your review and i've corrected formatting on my patch. It's
seems correct now. I've also corrected ChangeLog but it was tricky for
myself (write correct and clear english and think about what is
necessary details that i have to write in ChangeLog).
I've wrote documentation for this feature. All of these you can find
in attachment.
I've run general testsuites in original unpatched gdb-7.2 and save
stdout and stderr to separate files. After i've run exactly same tests
(make check) in patched gdb-7.2 and save to another separate files.
diff between these files shows me that my patch don't bring side
effects. Of course i understand that general testsuites can check only
for rough mistakes. So i should learn DejaGNU to test my patch. I
think on how i can test possible side effects from my patch. I can
send 'make check' results if you want.
So my patch, doc patch and ChangeLog needs a new review in any case.
I'm also send separate email to Tom Tromey about how i should assign
copyright for the community.

On Wed, Jun 29, 2011 at 2:35 AM, Phil Muldoon <pmuldoon@redhat.com> wrote:
> Tom Tromey <tromey@redhat.com> writes:

>> Whether this one meets the bar, I don't know.  Is basename really the
>> obvious transform to apply?  What about just dropping the compilation
>> directory?
>
> Well in this context, user-driven needs, to me, are the best bar.  If
> this contributor has written this patch, with a specific need (nota
> super-specialised) in mind that is great.  I wish I had the backtrace
> Pythonic interface ready, but, OTOH, every use-case is great to mould
> that functionality.
>
> Cheers,
>
> Phil
>

I thought on cutting off compilation path but i decided to make it
easier to start. If my tiny patch and idea is useful for somebody i
glad to improve this.

--
With best regards.
Eldar Gaynetdinov

[-- Attachment #2: gdb-7.2-nofull-path-3.patch --]
[-- Type: text/x-patch, Size: 5395 bytes --]

diff -rup gdb-7.2-orig/gdb/frame.h gdb-7.2/gdb/frame.h
--- gdb-7.2-orig/gdb/frame.h 2010-01-01 10:31:32.000000000 +0300
+++ gdb-7.2/gdb/frame.h 2011-07-03 17:49:36.748460000 +0400
@@ -582,7 +582,10 @@ enum print_what
/* Print both of the above. */
SRC_AND_LOC,
/* Print location only, but always include the address. */
- LOC_AND_ADDRESS
+ LOC_AND_ADDRESS,
+ /* Print only the location but without the full path to file, *
+ * i.e. print only filename even if full path is defined in symtable. */
+ LOC_NO_FULLPATH
};

/* Allocate zero initialized memory from the frame cache obstack.
diff -rup gdb-7.2-orig/gdb/stack.c gdb-7.2/gdb/stack.c
--- gdb-7.2-orig/gdb/stack.c 2010-07-01 19:36:17.000000000 +0400
+++ gdb-7.2/gdb/stack.c 2011-07-03 18:03:23.308460001 +0400
@@ -592,7 +592,8 @@ print_frame_info (struct frame_info *fra

location_print = (print_what == LOCATION
|| print_what == LOC_AND_ADDRESS
- || print_what == SRC_AND_LOC);
+ || print_what == SRC_AND_LOC
+ || print_what == LOC_NO_FULLPATH);

if (location_print || !sal.symtab)
print_frame (frame, print_level, print_what, print_args, sal);
@@ -652,7 +653,7 @@ print_frame_info (struct frame_info *fra
do_gdb_disassembly (get_frame_arch (frame), -1, sal.pc, sal.end);
}

- if (print_what != LOCATION)
+ if (print_what != LOCATION || print_what != LOC_NO_FULLPATH)
set_default_breakpoint (1, sal.pspace,
get_frame_pc (frame), sal.symtab, sal.line);

@@ -810,11 +811,24 @@ print_frame (struct frame_info *frame, i
ui_out_text (uiout, ")");
if (sal.symtab && sal.symtab->filename)
{
+ const char *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);
+
+ filename = NULL;
+ if (print_what == LOC_NO_FULLPATH)
+ {
+ filename = strrchr (sal.symtab->filename, '/');
+ if (filename != NULL)
+ filename++;
+ }
+ if (filename == NULL || *filename == '\0')
+ filename = sal.symtab->filename;
+
+ ui_out_field_string (uiout, "file", filename);
if (ui_out_is_mi_like_p (uiout))
{
const char *fullname = symtab_to_fullname (sal.symtab);
@@ -1269,7 +1283,7 @@ frame_info (char *addr_exp, int from_tty
frames. */

static void
-backtrace_command_1 (char *count_exp, int show_locals, int from_tty)
+backtrace_command_1 (char *count_exp, int show_locals, int from_tty, int nofull_path)
{
struct frame_info *fi;
int count;
@@ -1345,7 +1359,11 @@ backtrace_command_1 (char *count_exp, in
means further attempts to backtrace would fail (on the other
hand, perhaps the code does or could be fixed to make sure
the frame->prev field gets set to NULL in that case). */
- print_frame_info (fi, 1, LOCATION, 1);
+ if (nofull_path)
+ print_frame_info (fi, 1, LOC_NO_FULLPATH, 1);
+ else
+ print_frame_info (fi, 1, LOCATION, 1);
+
if (show_locals)
print_frame_local_vars (fi, 1, gdb_stdout);

@@ -1375,6 +1393,7 @@ struct backtrace_command_args
char *count_exp;
int show_locals;
int from_tty;
+ int nofull_path;
};

/* Stub for catch_errors. */
@@ -1384,7 +1403,8 @@ backtrace_command_stub (void *data)
{
struct backtrace_command_args *args = data;

- backtrace_command_1 (args->count_exp, args->show_locals, args->from_tty);
+ backtrace_command_1 (args->count_exp, args->show_locals,
+ args->from_tty, args->nofull_path);
return 0;
}

@@ -1392,7 +1412,7 @@ static void
backtrace_command (char *arg, int from_tty)
{
struct cleanup *old_chain = NULL;
- int fulltrace_arg = -1, arglen = 0, argc = 0;
+ int fulltrace_arg = -1, arglen = 0, argc = 0, nofull_path = -1;
struct backtrace_command_args btargs;

if (arg)
@@ -1412,6 +1432,8 @@ backtrace_command (char *arg, int from_t

if (fulltrace_arg < 0 && subset_compare (argv[i], "full"))
fulltrace_arg = argc;
+ else if (nofull_path < 0 && subset_compare (argv[i], "nopath"))
+ nofull_path = argc;
else
{
arglen += strlen (argv[i]);
@@ -1419,7 +1441,7 @@ backtrace_command (char *arg, int from_t
}
}
arglen += argc;
- if (fulltrace_arg >= 0)
+ if (fulltrace_arg >= 0 || nofull_path >= 0)
{
if (arglen > 0)
{
@@ -1427,7 +1449,7 @@ backtrace_command (char *arg, int from_t
memset (arg, 0, arglen + 1);
for (i = 0; i < (argc + 1); i++)
{
- if (i != fulltrace_arg)
+ if (i != fulltrace_arg && i != nofull_path)
{
strcat (arg, argv[i]);
strcat (arg, " ");
@@ -1442,9 +1464,10 @@ backtrace_command (char *arg, int from_t
btargs.count_exp = arg;
btargs.show_locals = (fulltrace_arg >= 0);
btargs.from_tty = from_tty;
+ btargs.nofull_path = (nofull_path >= 0);
catch_errors (backtrace_command_stub, &btargs, "", RETURN_MASK_ERROR);

- if (fulltrace_arg >= 0 && arglen > 0)
+ if ((fulltrace_arg >= 0 || nofull_path >= 0) && arglen > 0)
xfree (arg);

if (old_chain)
@@ -1459,6 +1482,7 @@ backtrace_full_command (char *arg, int f
btargs.count_exp = arg;
btargs.show_locals = 1;
btargs.from_tty = from_tty;
+ btargs.nofull_path = 0;
catch_errors (backtrace_command_stub, &btargs, "", RETURN_MASK_ERROR);
}
\f

[-- Attachment #3: gdb-7.2-nofull-path-texinfo.patch --]
[-- Type: text/x-patch, Size: 572 bytes --]

diff -rup gdb-7.2-doc-orig/gdb/doc/gdb.texinfo gdb-7.2/gdb/doc/gdb.texinfo
--- gdb-7.2-doc-orig/gdb/doc/gdb.texinfo 2010-09-01 23:15:59.000000000 +0400
+++ gdb-7.2/gdb/doc/gdb.texinfo 2011-07-03 17:36:48.328460001 +0400
@@ -5890,6 +5890,10 @@ Similar, but print only the outermost @v
@itemx bt full -@var{n}
Print the values of the local variables also. @var{n} specifies the
number of frames to print, as described above.
+
+@item backtrace nopath
+@itemx bt nopath
+It's similar to @code{backtrace}, but print without full path to file.
@end table

@kindex where

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

2011-06-26 Eldar Gaynetdinov <hal9000ed2k@gmail.com>

* frame.h (print_what): Added new element LOC_NO_FULLPATH with
comment.
* stack.c (print_frame_info): Added LOC_NO_FULLPATH in two places near
LOCATION.
(print_frame): Added new variable 'filename' in the condition
scope and the new conditions in this scope with 'filename' and
LOC_NO_FULLPATH before call ui_out_field_string with 'filename'.
'sal.symtab->filename' is used in body of these new conditions.
(backtrace_command_1): Added new argument of this function witn name
'nofull_path'. Added new condition with 'nofull_path'. Arguments that
are passed to print_frame_info depends on this new condition now.
(backtrace_command_args): Added new member 'nofull_path'.
(backtrace_command_stub): backtrace_command_1 is now called with new
argument 'args->nofull_path'.
(backtrace_command): Added new variable 'nofull_path' at this function
scope. Added new condition with 'nofull_path' and 'argv[i]'. 'argc' is
assigned to 'nofull_path' if this new condition is satisfied.
Modified condition with 'fulltrace_arg' by adding 'nofull_path'.
Modified condition with 'fulltrace_arg' in the for-loop by adding
'nofull_path'. Added assignment with 'btargs.nofull_path'. Modified
condition with 'fulltrace_arg' and 'arglen' by adding 'nofull_path'.
(backtrace_full_command): Assign zero to 'btargs.nofull_path' was
added.