[patch] New test for set backtrace related functionality

Paul Gilliam pgilliam@us.ibm.com
Thu Oct 14 22:47:00 GMT 2004


This has been tested on powerpc64-unknown-linux-gnu (in 32-bit mode) and on
i686-pc-linux-gnu
(repost to remove some left over template lines at end)

OK to commit?

-=# Paul Gilliam #=-

2004-10-14  Paul Gilliam  <pgilliam@us.ibm.com>

        * gdb.base/setbacktrace.c gdb.base/setbacktrace.exp: New files.

*** /dev/null	2004-04-15 13:01:52.000000000 -0700
--- gdb.base/setbacktrace.c	2004-10-14 14:08:52.000000000 -0700
***************
*** 0 ****
--- 1,40 ----
+ /* This testcase is part of GDB, the GNU debugger.
+ 
+    Copyright 2004 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 2 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, write to the Free Software
+    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+    02111-1307, USA.  */
+ 
+ int
+ factorial (int n)
+ {
+   if (n > 0) {                       /* marker: factorial */
+     return factorial (n - 1) * n;    /* marker: factorial recursion */
+   } else {
+     return 1;
+   }
+ }
+ 
+ int
+ main (int argc, char *argv[])
+ {
+   int depth = 3;
+ 
+   if (argc > 1) {
+     depth = atoi(argv[1]);
+   }
+ 
+   return factorial (depth);           /* marker: main call */
+ }
*** /dev/null	2004-04-15 13:01:52.000000000 -0700
--- gdb.base/setbacktrace.exp	2004-10-14 15:43:15.093157912 -0700
***************
*** 0 ****
--- 1,139 ----
+ # This file is part of the gdb testsuite.
+ 
+ # Copyright 2004 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 2 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, write to the Free Software
+ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+ 
+ # Check backtrace releated features not tested elsewhere in the testsuit:
+ #   *  Check that we know what backtrace options are available.
+ #   *  Check that GDB will only backtrace the requested number of frames.
+ #   *  Check that GDB doesn't backtrace past main unless asked to do so.
+ 
+ if $tracelevel {
+     strace $tracelevel
+ }
+ 
+ set prms_id 0
+ set bug_id 0
+ 
+ set testfile setbacktrace
+ set srcfile ${testfile}.c
+ set escapedsrcfile [string_to_regexp "${srcdir}/${subdir}/${srcfile}"]
+ set binfile ${objdir}/${subdir}/${testfile}
+ if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable 
{debug}] != "" } {
+     untested "Couldn't compile ${testfile}.c"
+     return -1
+ }
+ 
+ set fact_subr_line_nbr  [gdb_get_line_number "marker: factorial"]
+ set fact_recur_line_nbr [gdb_get_line_number "marker: factorial recursion"]
+ set main_subr_line_nbr  [gdb_get_line_number "marker: main call"]
+ 
+ # Set how deep should we go and build the expected_frames pattern list.
+ set leadin ".*\[\r\n\]"
+ set subr_depth 20
+ set expected_frames [list "$leadin#0  factorial \\(n=0\\) at 
$escapedsrcfile:$fact_subr_line_nbr"]
+ for {set ndx 1} {$ndx <= $subr_depth} {incr ndx} {
+   lappend expected_frames [format "$leadin#%-2d $hex in factorial 
\\(n=$ndx\\) at $escapedsrcfile:$fact_recur_line_nbr" $ndx]
+ }
+ lappend expected_frames [format "$leadin#%-2d $hex in main \\(argc=2, 
argv=$hex\\) at $escapedsrcfile:$main_subr_line_nbr" [expr $subr_depth + 1]]
+ #for {set ndx 0} {$ndx < [expr $subr_depth + 2]} {incr ndx} {
+ #  puts "$ndx:  [lindex $expected_frames $ndx]"
+ #}
+ 
+ 
+ # get things started
+ gdb_exit
+ gdb_start
+ gdb_reinitialize_dir $srcdir/$subdir
+ gdb_load ${binfile}
+ gdb_test "set args $subr_depth"
+ 
+ 
+ # Advance to main
+ if { ![runto_main] } then {
+     gdb_suppress_tests;
+ }
+ 
+ 
+ # Check that someone has not snuck in an extra backtrace option, if
+ # they do they will need to fix this and any such fix should also be
+ # accompanied by a corresponding SET test.
+ set test "set backtrace"
+ send_gdb "set backtrace\n"
+ set foobar [list \
+ 	 ".*\[\n\r\]+List of set backtrace subcommands:" \
+ 	 ".*\[\n\r\]+set backtrace limit -- Set an upper bound on the number of 
backtrace levels" \
+ 	 ".*\[\n\r\]+set backtrace past-main -- Set whether backtraces should 
continue past \"main\"" \
+ 	 ".*\[\n\r\]+Type \"help set backtrace\" followed by set backtrace 
subcommand name for full documentation." \
+ 	 ".*\[\n\r\]+Command name abbreviations are allowed if unambiguous."]
+ gdb_expect_list $test ".*$gdb_prompt $" $foobar
+ 
+ # Create a simple stack.
+ gdb_test "break factorial if n == 0"
+ gdb_continue_to_breakpoint "factorial"
+ 
+ # Check a backtrace to main (ignore any extra).
+ set test "full backtrace"
+ send_gdb "backtrace\n"
+ gdb_expect_list $test ".*$gdb_prompt $" $expected_frames
+ 
+ 
+ # Check a backtrace to main (don't ignore any extra).
+ #setup_kfail *-*-* gdb/1760
+ set test "full backtrace (exact)"
+ send_gdb "backtrace\n"
+ gdb_expect_list $test "\[\n\r\]+$gdb_prompt $" $expected_frames
+ 
+ 
+ # Check a backtrace short of main.
+ set test "partial backtrace"
+ set partial_depth [expr int($subr_depth / 2)]
+ set partial_frames [lrange $expected_frames 0 [expr $partial_depth - 1]]
+ lappend partial_frames "\[\n\r\]\\(More stack frames follow\\.\\.\\.\\)"
+ #for {set ndx 0} {$ndx < [expr $partial_depth + 2]} {incr ndx} {
+ #  puts "$ndx:  [lindex $partial_frames $ndx]"
+ #}
+ send_gdb "backtrace $partial_depth\n"
+ gdb_expect_list $test "\[\n\r\]+$gdb_prompt $" $partial_frames
+ 
+ 
+ ## Check a backtrace short of main due to limit.
+ set test "partial backtrace (using limit)"
+ set partial_frames [lrange $expected_frames 0 [expr $partial_depth - 1]]
+ lappend partial_frames "^\[\n\r]+Backtrace limit of $partial_depth exceeded"
+ #for {set ndx 0} {$ndx < [llength $partial_frames]} {incr ndx} {
+ #  puts "$ndx:  [lindex $partial_frames $ndx]"
+ #}
+ gdb_test "set backtrace limit $partial_depth" ".*" "Set the backtrace limit 
to $partial_depth"
+ setup_kfail *-*-* gdb/1760
+ send_gdb "backtrace\n"
+ gdb_expect_list $test "\[\r\n]+$gdb_prompt $" $partial_frames
+ 
+ 
+ # Check a backtrace past main, specify a backtrace limit so it does not fall 
off the end of the stack.
+ set test "backtrace past main"
+ set bt_limit [expr $subr_depth + 3]
+ gdb_test "set backtrace past-main" ".*" "Set the backtrace past-main"
+ gdb_test "set backtrace limit 0" ".*" "Set the backtrace limit to unlimited"
+ set extra_frames [lrange $expected_frames 0 [expr $subr_depth + 2]]
+ lappend extra_frames [format "$leadin#%-2d $hex in \[^ \]+ \\(\[^\\)]*\\) 
\[^\r\n]*" [expr $subr_depth + 2]]
+ lappend extra_frames "\\(More stack frames follow\\.\\.\\.\\)"
+ #for {set ndx 0} {$ndx < [llength $extra_frames]} {incr ndx} {
+ #  puts "$ndx:  [lindex $extra_frames $ndx]"
+ #}
+ send_gdb "backtrace $bt_limit\n"
+ gdb_expect_list $test ".*\[\r\n]+$gdb_prompt $" $extra_frames
+ 



More information about the Gdb-patches mailing list