1# Copyright 2003-2017 Free Software Foundation, Inc. 2 3# This program is free software; you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation; either version 3 of the License, or 6# (at your option) any later version. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16# Find a pathname to a file that we would execute if the shell was asked 17# to run $arg using the current PATH. 18 19proc find_gdb { arg } { 20 21 # If the arg directly specifies an existing executable file, then 22 # simply use it. 23 24 if [file executable $arg] then { 25 return $arg 26 } 27 28 set result [which $arg] 29 if [string match "/" [ string range $result 0 0 ]] then { 30 return $result 31 } 32 33 # If everything fails, just return the unqualified pathname as default 34 # and hope for best. 35 36 return $arg 37} 38 39# A helper proc that sets up for self-testing. 40# EXECUTABLE is the gdb to use. 41# FUNCTION is the function to break in, either captured_main 42# or captured_command_loop. 43 44proc selftest_setup { executable function } { 45 global gdb_prompt 46 global timeout 47 global INTERNAL_GDBFLAGS 48 49 # load yourself into the debugger 50 # This can take a relatively long time, particularly for testing where 51 # the executable is being accessed over a network, or where gdb does not 52 # support partial symbols for a particular target and has to load the 53 # entire symbol table. Set the timeout to 10 minutes, which should be 54 # adequate for most environments (it *has* timed out with 5 min on a 55 # SPARCstation SLC under moderate load, so this isn't unreasonable). 56 # After gdb is started, set the timeout to 30 seconds for the duration 57 # of this test, and then back to the original value. 58 59 set oldtimeout $timeout 60 set timeout 600 61 verbose "Timeout is now $timeout seconds" 2 62 63 global gdb_file_cmd_debug_info 64 set gdb_file_cmd_debug_info "unset" 65 66 set result [gdb_load $executable] 67 set timeout $oldtimeout 68 verbose "Timeout is now $timeout seconds" 2 69 70 if { $result != 0 } then { 71 return -1 72 } 73 74 if { $gdb_file_cmd_debug_info != "debug" } then { 75 untested "no debug information, skipping testcase." 76 return -1 77 } 78 79 # Set a breakpoint at main 80 gdb_test "break $function" \ 81 "Breakpoint.*at.* file.*, line.*" \ 82 "breakpoint in $function" 83 84 # run yourself 85 # It may take a very long time for the inferior gdb to start (lynx), 86 # so we bump it back up for the duration of this command. 87 set timeout 600 88 89 set description "run until breakpoint at $function" 90 gdb_test_multiple "run $INTERNAL_GDBFLAGS" "$description" { 91 -re "Starting program.*Breakpoint \[0-9\]+,.*$function .data.* at .*main.c:.*$gdb_prompt $" { 92 pass "$description" 93 } 94 -re "Starting program.*Breakpoint \[0-9\]+,.*$function .data.*$gdb_prompt $" { 95 xfail "$description (line numbers scrambled?)" 96 } 97 -re "Starting program.*Breakpoint \[0-9\]+,.* at .*main.c:.*$function.*$gdb_prompt $" { 98 # $function may be inlined, so the program stops at the line 99 # calling $function. 100 pass "$description" 101 } 102 -re "vfork: No more processes.*$gdb_prompt $" { 103 fail "$description (out of virtual memory)" 104 set timeout $oldtimeout 105 verbose "Timeout is now $timeout seconds" 2 106 return -1 107 } 108 -re ".*$gdb_prompt $" { 109 fail "$description" 110 set timeout $oldtimeout 111 verbose "Timeout is now $timeout seconds" 2 112 return -1 113 } 114 } 115 116 set timeout $oldtimeout 117 verbose "Timeout is now $timeout seconds" 2 118 119 return 0 120} 121 122# A simple way to run some self-tests. 123 124proc do_self_tests {function body} { 125 global GDB tool 126 127 # Are we on a target board. 128 if { [is_remote target] || ![isnative] } then { 129 return 130 } 131 132 # Run the test with self. Copy the file executable file in case 133 # this OS doesn't like to edit its own text space. 134 135 set GDB_FULLPATH [find_gdb $GDB] 136 137 if {[is_remote host]} { 138 set xgdb x$tool 139 } else { 140 set xgdb [standard_output_file x$tool] 141 } 142 143 # Remove any old copy lying around. 144 remote_file host delete $xgdb 145 146 gdb_start 147 set file [remote_download host $GDB_FULLPATH $xgdb] 148 149 set result [selftest_setup $file $function] 150 if {$result == 0} then { 151 set result [uplevel $body] 152 } 153 154 gdb_exit 155 catch "remote_file host delete $file" 156 157 if {$result < 0} then { 158 warning "Couldn't test self" 159 } 160} 161