[RFC] net testcase for set backtrace related functionality

Paul Gilliam pgilliam@us.ibm.com
Tue Oct 12 23:21:00 GMT 2004

Here is a suggested testcase for "set backtrace" related commands.  I have 
tested it on powerpc64-unknown-linux-gnu (in 32-bit mode), but I'm not sure 
if it's complete.

-=# Paul Gilliam #=-

-------------- next part --------------
A non-text attachment was scrubbed...
Name: setbacktrace.c
Type: text/x-csrc
Size: 1177 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/gdb-patches/attachments/20041012/72f1ce8d/attachment.bin>
-------------- next part --------------
# 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
# 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_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
gdb_test "set args $subr_depth"

# Advance to main
if { ![runto_main] } then {

# 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 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 \[^ \]+ \\(\[^\\)]*\\) .*" [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

More information about the Gdb-patches mailing list