1# Test `info auxv' and related functionality. 2 3# Copyright 1992,1993,1994,1995,1996,1997,1998,1999,2000,2004 4# Free Software Foundation, Inc. 5 6# This program is free software; you can redistribute it and/or modify 7# it under the terms of the GNU General Public License as published by 8# the Free Software Foundation; either version 2 of the License, or 9# (at your option) any later version. 10# 11# This program is distributed in the hope that it will be useful, 12# but WITHOUT ANY WARRANTY; without even the implied warranty of 13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14# GNU General Public License for more details. 15# 16# You should have received a copy of the GNU General Public License 17# along with this program; if not, write to the Free Software 18# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 19 20# Please email any bugs, comments, and/or additions to this file to: 21# bug-gdb@prep.ai.mit.edu 22 23# This file is based on corefile.exp which was written by Fred 24# Fish. (fnf@cygnus.com) 25 26if $tracelevel then { 27 strace $tracelevel 28} 29 30set prms_id 0 31set bug_id 0 32 33set testfile "auxv" 34set srcfile ${testfile}.c 35set binfile ${objdir}/${subdir}/${testfile} 36set corefile ${objdir}/${subdir}/${testfile}.corefile 37set gcorefile ${objdir}/${subdir}/${testfile}.gcore 38 39if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { 40 gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." 41} 42 43# Use a fresh directory to confine the native core dumps. 44# Make it the working directory for gdb and its child. 45set coredir "${objdir}/${subdir}/coredir.[getpid]" 46file mkdir $coredir 47set core_works [isnative] 48 49# Run GDB on the test program up to where it will dump core. 50 51gdb_exit 52gdb_start 53gdb_reinitialize_dir $srcdir/$subdir 54gdb_load ${binfile} 55gdb_test "set print sevenbit-strings" "" \ 56 "set print sevenbit-strings; ${testfile}" 57gdb_test "set width 0" "" \ 58 "set width 0; ${testfile}" 59 60if {$core_works} { 61 if {[gdb_test "cd $coredir" ".*Working directory .*" \ 62 "cd to temporary directory for core dumps"]} { 63 set core_works 0 64 } 65} 66 67if { ![runto_main] } then { 68 gdb_suppress_tests; 69} 70set print_core_line [gdb_get_line_number "ABORT;"] 71gdb_test "tbreak $print_core_line" 72gdb_test continue ".*ABORT;.*" 73 74proc fetch_auxv {test} { 75 global gdb_prompt 76 77 set auxv_lines {} 78 set bad -1 79 if {[gdb_test_multiple "info auxv" $test { 80 -re "info auxv\[\r\n\]+" { 81 exp_continue 82 } 83 -ex "The program has no auxiliary information now" { 84 set bad 1 85 exp_continue 86 } 87 -ex "Auxiliary vector is empty" { 88 set bad 1 89 exp_continue 90 } 91 -ex "No auxiliary vector found" { 92 set bad 1 93 exp_continue 94 } 95 -re "^\[0-9\]+\[ \t\]+(AT_\[^ \t\]+)\[^\r\n\]+\[\r\n\]+" { 96 lappend auxv_lines $expect_out(0,string) 97 exp_continue 98 } 99 -re "^\[0-9\]+\[ \t\]+\\?\\?\\?\[^\r\n\]+\[\r\n\]+" { 100 warning "Unrecognized tag value: $expect_out(0,string)" 101 set bad 1 102 lappend auxv_lines $expect_out(0,string) 103 exp_continue 104 } 105 -re ".*$gdb_prompt $" { 106 incr bad 107 } 108 -re "^\[^\r\n\]+\[\r\n\]+" { 109 if {!$bad} { 110 warning "Unrecognized output: $expect_out(0,string)" 111 set bad 1 112 } 113 exp_continue 114 } 115 }] != 0} { 116 return {} 117 } 118 119 if {$bad} { 120 fail $test 121 return {} 122 } 123 124 pass $test 125 return $auxv_lines 126} 127 128set live_data [fetch_auxv "info auxv on live process"] 129 130# Now try gcore. 131set gcore_works 0 132set escapedfilename [string_to_regexp $gcorefile] 133gdb_test_multiple "gcore $gcorefile" "gcore" { 134 -re "Saved corefile ${escapedfilename}\[\r\n\]+$gdb_prompt $" { 135 pass "gcore" 136 set gcore_works 1 137 } 138 -re "Can't create a corefile\[\r\n\]+$gdb_prompt $" { 139 unsupported "gcore" 140 } 141} 142 143# Let the program continue and die. 144gdb_test continue ".*Program received signal.*" 145gdb_test continue ".*Program terminated with signal.*" 146 147# Now collect the core dump it left. 148set test "generate native core dump" 149if {$core_works} { 150 # Find the 151 set names [glob -nocomplain -directory $coredir *core*] 152 if {[llength $names] == 1} { 153 set file [file join $coredir [lindex $names 0]] 154 remote_exec build "mv $file $corefile" 155 pass $test 156 } else { 157 set core_works 0 158 warning "can't generate a core file - core tests suppressed - check ulimit -c" 159 fail $test 160 } 161} else { 162 unsupported $test 163} 164remote_exec build "rm -rf $coredir" 165 166# Now we can examine the core files and check that their data matches what 167# we saw in the process. Note that the exact data can vary between runs, 168# so it's important that the native core dump file and the gcore-created dump 169# both be from the same run of the program as we examined live. 170 171proc do_core_test {works corefile test1 test2} { 172 if {! $works} { 173 unsupported $test1 174 unsupported $test2 175 } else { 176 gdb_test "core $corefile" "Core was generated by.*" \ 177 "load core file for $test1" \ 178 "A program is being debugged already.*" "y" 179 set core_data [fetch_auxv $test1] 180 global live_data 181 if {$core_data == $live_data} { 182 pass $test2 183 } else { 184 fail $test2 185 } 186 } 187} 188 189do_core_test $core_works $corefile \ 190 "info auxv on native core dump" "matching auxv data from live and core" 191 192do_core_test $gcore_works $gcorefile \ 193 "info auxv on gcore-created dump" "matching auxv data from live and gcore" 194