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

iam ahal
2011-07-19T12:17:05Z

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

I've made tiny changes in my test script. You can find out everything
in the attachment (i.e. every my message with attachment is suitable
to possible commit, if it will be reviewed).

My test script is separate *.exp file but I don't sure that it's right.
To test I just run:

... gdb-7.2/gdb/testsuite$ runtest --all gdb.base/bt-nopath.exp

Is everything ok? Or what I should change?

[-- Attachment #2: gdb-7.2-backtrace-nofull-2.patch --]
[-- Type: text/x-patch, Size: 9504 bytes --]

diff -rupN gdb-7.2-orig/gdb/doc/gdb.texinfo gdb-7.2/gdb/doc/gdb.texinfo
--- gdb-7.2-orig/gdb/doc/gdb.texinfo 2010-09-01 23:15:59.000000000 +0400
+++ gdb-7.2/gdb/doc/gdb.texinfo 2011-07-18 22:36:21.714535001 +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
+Same as @code{backtrace}, but print only the basename of the file.
@end table

@kindex where
diff -rupN 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-18 22:36:21.714535001 +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 -rupN 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-18 22:36:21.714535001 +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,21 @@ 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 = lbasename (sal.symtab->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 +1280,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 +1356,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 +1390,7 @@ struct backtrace_command_args
char *count_exp;
int show_locals;
int from_tty;
+ int nofull_path;
};

/* Stub for catch_errors. */
@@ -1384,7 +1400,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 +1409,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 +1429,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 +1438,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 +1446,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 +1461,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 +1479,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
diff -rupN gdb-7.2-orig/gdb/testsuite/gdb.base/bt-nopath.c gdb-7.2/gdb/testsuite/gdb.base/bt-nopath.c
--- gdb-7.2-orig/gdb/testsuite/gdb.base/bt-nopath.c 1970-01-01 03:00:00.000000000 +0300
+++ gdb-7.2/gdb/testsuite/gdb.base/bt-nopath.c 2011-07-18 22:36:21.714535001 +0400
@@ -0,0 +1,17 @@
+
+void func1()
+{
+
+}
+
+void func()
+{
+ func1();
+}
+
+int main()
+{
+ func();
+
+ return 0;
+}
diff -rupN gdb-7.2-orig/gdb/testsuite/gdb.base/bt-nopath.exp gdb-7.2/gdb/testsuite/gdb.base/bt-nopath.exp
--- gdb-7.2-orig/gdb/testsuite/gdb.base/bt-nopath.exp 1970-01-01 03:00:00.000000000 +0300
+++ gdb-7.2/gdb/testsuite/gdb.base/bt-nopath.exp 2011-07-19 14:55:58.845733001 +0400
@@ -0,0 +1,112 @@
+# Copyright 2011 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+if $tracelevel then {
+ strace $tracelevel
+}
+
+set testfile "bt-nopath"
+set srcfile ${testfile}.c
+set binfile ${objdir}/${subdir}/${testfile}
+
+proc bt_compile { path } {
+ global binfile
+
+ if { [gdb_compile $path $binfile executable {debug nowarnings}] != "" } {
+ return -1
+ }
+
+ if [get_compiler_info $binfile] {
+ return -1
+ }
+}
+
+proc bt_line { num func {flag ""} } {
+ global srcfile
+
+ if { [string match $flag full] } {
+ return "\#${num}.*${func}.*().*at\\s*/.*${srcfile}.*"
+ } elseif { [string match $flag rel] } {
+ return "\#${num}.*${func}.*().*at\\s*\\..*${srcfile}.*"
+ } else {
+ return "\#${num}.*${func}.*().*at\\s*${srcfile}.*"
+ }
+}
+
+proc nopath_test { {flag ""} } {
+ global srcdir
+ global subdir
+ global binfile
+ global gdb_prompt
+
+ gdb_exit
+ gdb_start
+ gdb_reinitialize_dir ${srcdir}/${subdir}
+ gdb_load ${binfile}
+
+ gdb_breakpoint main
+ gdb_breakpoint func
+ gdb_breakpoint func1
+
+ gdb_run_cmd
+ gdb_expect {
+ -re "Breakpoint 1,.*main.* at .*:.*${gdb_prompt} $" {
+ pass "run until function breakpoint"
+ }
+ -re "$gdb_prompt $" {
+ fail "run until function breakpoint"
+ }
+ timeout {
+ fail "run until function breakpoint (timeout)"
+ }
+ }
+
+ gdb_test "backtrace" [bt_line 0 main $flag]
+ gdb_test "backtrace nopath" [bt_line 0 main]
+
+ gdb_continue func
+
+ gdb_test "backtrace" [bt_line 0 func $flag][bt_line 1 main $flag]
+ gdb_test "backtrace nopath" [bt_line 0 func][bt_line 1 main]
+
+ gdb_continue func1
+
+ gdb_test "backtrace" [bt_line 0 func1 $flag][bt_line 1 func $flag][bt_line 2 main $flag]
+ gdb_test "backtrace nopath" [bt_line 0 func1][bt_line 1 func][bt_line 2 main]
+}
+
+set save_pwd [pwd]
+cd $subdir
+set full_src_path [pwd]/${srcfile}
+cd $save_pwd
+
+if { [bt_compile $full_src_path] == -1 } {
+ untested bt-nopath.exp
+ return -1
+}
+
+nopath_test full
+
+remote_exec build "rm -f ${binfile}"
+
+set rel_src_path [exec find . -path *${srcdir}/${subdir}/${srcfile}]
+
+if { [bt_compile $rel_src_path] == -1 } {
+ untested bt-nopath.exp
+ return -1
+}
+
+nopath_test rel
+

[-- Attachment #3: ChangeLog --]
[-- Type: application/octet-stream, Size: 1445 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.
* bt-nopath.exp: New file.
* bt-nopath.c: New file.