This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


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?
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);
 }
 
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: ChangeLog
Description: Binary data


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]