This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[patch] New test for set backtrace related functionality
- From: Paul Gilliam <pgilliam at us dot ibm dot com>
- To: gdb-patches at sources dot redhat dot com
- Cc: Andrew Cagney <cagney at gnu dot org>,Michael Chastain <mec dot gnu at mindspring dot com>
- Date: Thu, 14 Oct 2004 15:39:18 -0700
- Subject: [patch] New test for set backtrace related functionality
- Reply-to: pgilliam at us dot ibm dot com
This has been tested on powerpc64-unknown-linux-gnu (in 32-bit mode) and on
i686-pc-linux-gnu
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 14:58:54.728594800 -0700
***************
*** 0 ****
--- 1,147 ----
+ # 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
+
+
+ # Re-check that bactrace to main.
+
+
+ # Set the backtrace limit.
+
+
+ # Re-set limit to unlimited