diff options
author | Michael Chastain <mec@google.com> | 2003-07-15 16:28:21 +0000 |
---|---|---|
committer | Michael Chastain <mec@google.com> | 2003-07-15 16:28:21 +0000 |
commit | 98a23b3f746e24a90d40ade25b6d31642ab4feb8 (patch) | |
tree | 907c9b2c321ca345850d47ae449a777ecf2919b7 | |
parent | d9170e221cd615068a166345d86bc1a29643996f (diff) | |
download | gdb-98a23b3f746e24a90d40ade25b6d31642ab4feb8.zip gdb-98a23b3f746e24a90d40ade25b6d31642ab4feb8.tar.gz gdb-98a23b3f746e24a90d40ade25b6d31642ab4feb8.tar.bz2 |
2003-07-15 Michael Chastain <mec@shout.net>
* gdb.base/gdb1250.exp: New file.
* gdb.base/gdb1250.c: New file.
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/gdb1250.c | 57 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/gdb1250.exp | 80 |
3 files changed, 142 insertions, 0 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index f957ee8..60d1a6e 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-07-15 Michael Chastain <mec@shout.net> + + * gdb.base/gdb1250.exp: New file. + * gdb.base/gdb1250.c: New file. + 2003-07-09 Michal Ludvig <mludvig@suse.cz> * gdb.c++/templates.exp (test_ptype_of_templates): Recognize diff --git a/gdb/testsuite/gdb.base/gdb1250.c b/gdb/testsuite/gdb.base/gdb1250.c new file mode 100644 index 0000000..9d73f67 --- /dev/null +++ b/gdb/testsuite/gdb.base/gdb1250.c @@ -0,0 +1,57 @@ +/* Test program for stack trace through noreturn function. + + Copyright 2003 Free Software Foundation, Inc. + + This file is part of the gdb testsuite. + + 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. + + This file was written by Michael Elizabeth Chastain (mec@shout.net). */ + +#include <stdlib.h> + +int global = 0; + +void gamma (int *parray) +{ + return; +} + +void beta () +{ + int array [4]; + array [0] = global++; + array [1] = global++; + array [2] = global++; + array [3] = global++; + gamma (array); + abort (); +} + +int alpha () +{ + global++; + beta (); + return 0; +} + +int main () +{ + int i; + global++; + i = alpha (); + return i; +} diff --git a/gdb/testsuite/gdb.base/gdb1250.exp b/gdb/testsuite/gdb.base/gdb1250.exp new file mode 100644 index 0000000..60a6f59 --- /dev/null +++ b/gdb/testsuite/gdb.base/gdb1250.exp @@ -0,0 +1,80 @@ +# Copyright 2003 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. + +# Tests for PR gdb/1250. +# 2003-07-15 Michael Chastain <mec@shout.net> + +# This file is part of the gdb testsuite. + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "gdb1250" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if ![runto abort] then { + perror "couldn't run to breakpoint" + continue +} + +# See http://sources.redhat.com/gdb/bugs/1250 +# +# In a nutshell: the function 'beta' ends with a call to 'abort', which +# is a noreturn function. So the last instruction of 'beta' is a call +# to 'abort'. When gdb looks for information about the caller of +# 'beta', it looks at the instruction after the call to 'abort' -- which +# is the first instruction of 'alpha'! So gdb uses the wrong frame +# information. It thinks that the test program is in 'alpha' and that +# the prologue "push %ebp / mov %esp,%ebp" has not been executed yet, +# and grabs the wrong values. +# +# By the nature of the bug, it could pass if the C compiler is not smart +# enough to implement 'abort' as a noreturn function. This is okay. +# The real point is that users often put breakpoints on noreturn +# functions such as 'abort' or some kind of exitting function, and those +# breakpoints should work. + +gdb_test_multiple "backtrace" "backtrace from abort" { + -re "#0.*abort.*\r\n#1.*beta.*\r\n#2.*alpha.*\r\n#3.*main.*\r\n$gdb_prompt $" { + pass "backtrace from abort" + } + -re "#0.*abort.*\r\n#1.*beta.*\r\n$gdb_prompt $" { + # This happens with gdb HEAD as of 2003-07-13, with gcc 3.3, + # binutils 2.14, either -gdwarf-2 or -gstabs+, on native + # i686-pc-linux-gnu. + # + # gdb gets 'abort' and 'beta' right and then goes into the + # weeds. + kfail "gdb/1250" "backtrace from abort" + } +} |