From d65308ae79413c95905bf24c08bb8353d23f475f Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Tue, 16 Mar 2004 21:47:03 +0000 Subject: [PATCH] 2004-03-16 Roland McGrath * gdb.base/auxv.exp: New file. * gdb.base/auxv.c: New file, copied verbatim from coremaker2.c. --- gdb/testsuite/gdb.base/auxv.c | 58 ++++++++++ gdb/testsuite/gdb.base/auxv.exp | 187 ++++++++++++++++++++++++++++++++ 2 files changed, 245 insertions(+) create mode 100644 gdb/testsuite/gdb.base/auxv.c create mode 100644 gdb/testsuite/gdb.base/auxv.exp diff --git a/gdb/testsuite/gdb.base/auxv.c b/gdb/testsuite/gdb.base/auxv.c new file mode 100644 index 00000000000..94f9d000f48 --- /dev/null +++ b/gdb/testsuite/gdb.base/auxv.c @@ -0,0 +1,58 @@ +/* Simple little program that just generates a core dump from inside some + nested function calls. Keep this as self contained as possible, I.E. + use no environment resources other than possibly abort(). */ + +#ifndef __STDC__ +#define const /**/ +#endif + +#ifndef HAVE_ABORT +#define HAVE_ABORT 1 +#endif + +#if HAVE_ABORT +#define ABORT abort() +#else +#define ABORT {char *invalid = 0; *invalid = 0xFF;} +#endif + +/* Don't make these automatic vars or we will have to walk back up the + stack to access them. */ + +char *buf1; +char *buf2; + +int coremaker_data = 1; /* In Data section */ +int coremaker_bss; /* In BSS section */ + +const int coremaker_ro = 201; /* In Read-Only Data section */ + +void +func2 (int x) +{ + int coremaker_local[5]; + int i; + static int y; + + /* Make sure that coremaker_local doesn't get optimized away. */ + for (i = 0; i < 5; i++) + coremaker_local[i] = i; + coremaker_bss = 0; + for (i = 0; i < 5; i++) + coremaker_bss += coremaker_local[i]; + coremaker_data = coremaker_ro + 1; + y = 10 * x; + ABORT; +} + +void +func1 (int x) +{ + func2 (x * 2); +} + +int main () +{ + func1 (10); + return 0; +} diff --git a/gdb/testsuite/gdb.base/auxv.exp b/gdb/testsuite/gdb.base/auxv.exp new file mode 100644 index 00000000000..3a509b98242 --- /dev/null +++ b/gdb/testsuite/gdb.base/auxv.exp @@ -0,0 +1,187 @@ +# Test `info auxv' and related functionality. + +# Copyright 1992,1993,1994,1995,1996,1997,1998,1999,2000,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. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file is based on corefile.exp which was written by Fred +# Fish. (fnf@cygnus.com) + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile "auxv" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} +set corefile ${objdir}/${subdir}/${testfile}.corefile +set gcorefile ${objdir}/${subdir}/${testfile}.gcore + +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." +} + +# Use a fresh directory to confine the native core dumps. +# Make it the working directory for gdb and its child. +set coredir "${objdir}/${subdir}/coredir.[getpid]" +file mkdir $coredir +set core_works [isnative] + +# Run GDB on the test program up to where it will dump core. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} +gdb_test "set print sevenbit-strings" "" \ + "set print sevenbit-strings; ${testfile}" +gdb_test "set width 0" "" \ + "set width 0; ${testfile}" + +if {$core_works} { + if {[gdb_test "cd $coredir" ".*Working directory .*" \ + "cd to temporary directory for core dumps"]} { + set core_works 0 + } +} + +if { ![runto_main] } then { + gdb_suppress_tests; +} +set print_core_line [gdb_get_line_number "ABORT;"] +gdb_test "tbreak $print_core_line" +gdb_test continue ".*ABORT;.*" + +proc fetch_auxv {test} { + global gdb_prompt + + set auxv_lines {} + set bad -1 + if {[gdb_test_multiple "info auxv" $test { + -re "info auxv\[\r\n\]+" { + exp_continue + } + -ex "The program has no auxiliary information now" { + set bad 1 + } + -ex "Auxiliary vector is empty" { + set bad 1 + } + -ex "No auxiliary vector found" { + set bad 1 + } + -re "^\[0-9\]+\[ \t\]+(AT_\[^ \t\]+)\[^\r\n\]+\[\r\n\]+" { + lappend auxv_lines $expect_out(0,string) + exp_continue + } + -re "^\[0-9\]+\[ \t\]+\\?\\?\\?\[^\r\n\]+\[\r\n\]+" { + warning "Unrecognized tag value: $expect_out(0,string)" + set bad 1 + lappend auxv_lines $expect_out(0,string) + exp_continue + } + -re ".*$gdb_prompt $" { + incr bad + } + -re "^\[^\r\n\]+\[\r\n\]+" { + warning "Unrecognized output: $expect_out(0,string)" + set bad 1 + } + }] != 0} { + return {} + } + + if {$bad} { + fail $test + return {} + } + + pass $test + return $auxv_lines +} + +set live_data [fetch_auxv "info auxv on live process"] + +# Now try gcore. +set gcore_works 0 +set escapedfilename [string_to_regexp $gcorefile] +gdb_test_multiple "gcore $gcorefile" "gcore" { + -re "Saved corefile ${escapedfilename}\[\r\n\]+$gdb_prompt $" { + pass "gcore" + set gcore_works 1 + } + -re "Can't create a corefile\[\r\n\]+$gdb_prompt $" { + unsupported "gcore" + } +} + +# Let the program continue and die. +gdb_test continue ".*Program received signal.*" +gdb_test continue ".*Program terminated with signal.*" + +# Now collect the core dump it left. +set test "generate native core dump" +if {$core_works} { + # Find the + set names [glob -nocomplain -directory $coredir *core*] + if {[llength $names] == 1} { + set file [file join $coredir [lindex $names 0]] + remote_exec build "mv $file $corefile" + pass $test + } else { + set core_works 0 + warning "can't generate a core file - core tests suppressed - check ulimit -c" + fail $test + } +} else { + unsupported $test +} +remote_exec build "rm -rf $coredir" + +# Now we can examine the core files and check that their data matches what +# we saw in the process. Note that the exact data can vary between runs, +# so it's important that the native core dump file and the gcore-created dump +# both be from the same run of the program as we examined live. + +proc do_core_test {works corefile test1 test2} { + if {! $works} { + unsupported $test1 + unsupported $test2 + } else { + gdb_test "core $corefile" "Core was generated by.*" \ + "load core file for $test1" \ + "A program is being debugged already.*" "y" + set core_data [fetch_auxv $test1] + global live_data + if {$core_data == $live_data} { + pass $test2 + } else { + fail $test2 + } + } +} + +do_core_test $core_works $corefile \ + "info auxv on native core dump" "matching auxv data from live and core" + +do_core_test $gcore_works $gcorefile \ + "info auxv on gcore-created dump" "matching auxv data from live and gcore" -- 2.30.2