1# Copyright 1988-2020 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# This file was written by Rob Savoye. (rob@cygnus.com) 17 18load_lib selftest-support.exp 19 20proc test_with_self { } { 21 global gdb_prompt 22 global decimal 23 global timeout 24 global inferior_spawn_id 25 26 # When GDB is built as a C++ program, disassemble shows the full 27 # prototype. 28 set cxx_main_args_re [string_to_regexp "(int, char**)"] 29 30 # disassemble yourself 31 gdb_test "x/10i main" \ 32 "x/10i.*main.*main($cxx_main_args_re)?.$decimal.*main($cxx_main_args_re)?.$decimal.*" \ 33 "disassemble main" 34 35 # We'll need this when we send a ^C to GDB. Need to do it before we 36 # run the program and gdb starts saving and restoring tty states. 37 gdb_test "shell stty intr '^C'" ".*" \ 38 "set interrupt character in test_with_self" 39 40 # FIXME: If we put this after the run to main, the first list 41 # command doesn't print the same line as the current line where 42 # gdb is stopped. 43 gdb_test_no_output "set listsize 1" "set listsize to 1" 44 45 # do we have a version number ? 46 gdb_test_multiple "print version" "printed version" { 47 -re ".\[0-9\]+ = .\[0-9.\]+.*$gdb_prompt $" { 48 pass "printed version as string" 49 } 50 -re ".\[0-9\]+ = +0x.*\[0-9.\]+.*$gdb_prompt $" { 51 pass "printed version as pointer" 52 } 53 -re ".\[0-9\]+ = +.+ +0x.*\[0-9.\]+.*$gdb_prompt $" { 54 pass "printed version with cast" 55 } 56 } 57 58 # start the "xgdb" process 59 if [target_info exists gdb,noinferiorio] { 60 # With no way to interact with the inferior GDB, all we can do 61 # is let it run. 62 send_gdb "continue\n" 63 # Wait a bit while the inferior gdb gets to its prompt. 64 sleep 1 65 } else { 66 set banner [multi_line \ 67 "GNU gdb \[0-9\.\]*\[^\r\n\]*" \ 68 "Copyright \\(C\\) \[0-9\]* Free Software Foundation, Inc\." \ 69 "License GPLv3\\+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>" \ 70 "This is free software: you are free to change and redistribute it\." \ 71 "There is NO WARRANTY, to the extent permitted by law\." \ 72 "Type \"show copying\" and \"show warranty\" for details\." \ 73 "This GDB was configured as .*" \ 74 "$gdb_prompt $"] 75 set test "xgdb is at prompt" 76 gdb_test_multiple "continue" $test { 77 -i "$inferior_spawn_id" 78 -re "$banner" { 79 pass $test 80 } 81 } 82 83 # set xgdb prompt so we can tell which is which 84 send_inferior "set prompt (xgdb) \n" 85 set msg "Set xgdb_prompt" 86 gdb_test_multiple "" $msg { 87 -i "$inferior_spawn_id" 88 -re "\[(\]xgdb\[)\].*\[(\]xgdb\[)\] $" { 89 pass $msg 90 } 91 } 92 } 93 94 # kill the xgdb process 95 if ![target_info exists gdb,nointerrupts] { 96 set description "send ^C to child process" 97 send_gdb "\003" 98 # "Thread 1" is displayed iff Guile support is linked in. 99 gdb_expect { 100 -re "(Thread .*|Program) received signal SIGINT.*$gdb_prompt $" { 101 pass "$description" 102 } 103 -re ".*$gdb_prompt $" { 104 fail "$description" 105 } 106 timeout { 107 fail "$description (timeout)" 108 } 109 } 110 } 111 112 set description "send SIGINT signal to child process" 113 gdb_test_multiple "signal SIGINT" "$description" { 114 -re "^signal SIGINT\r\nContinuing with signal SIGINT.\r\nQuit\r\n.* $" { 115 pass "$description" 116 } 117 } 118 119 set description "send ^C to child process again" 120 send_gdb "\003" 121 gdb_expect { 122 -re "(Thread .*|Program) received signal SIGINT.*$gdb_prompt $" { 123 pass "$description" 124 } 125 -re ".*$gdb_prompt $" { 126 fail "$description" 127 } 128 timeout { 129 fail "$description (timeout)" 130 } 131 } 132 133 134 # Switch back to the GDB thread if Guile support is linked in. 135 # "signal SIGINT" could also switch the current thread. 136 gdb_test "thread 1" {\[Switching to thread 1 .*\].*} 137 138 # get a stack trace 139 # 140 # This fails on some linux systems for unknown reasons. On the 141 # systems where it fails, sometimes it works fine when run manually. 142 # The testsuite failures may not be limited to just aout systems. 143 setup_xfail "i*86-pc-linuxaout-gnu" 144 set description "backtrace through signal handler" 145 gdb_test_multiple "backtrace" "$description" { 146 -re "#0.*(read|poll).*in main \\(.*\\) at .*gdb\\.c.*$gdb_prompt $" { 147 pass "$description" 148 } 149 } 150 151 # Restart gdb in case next test expects it to be started already. 152 return 0 153} 154 155do_self_tests captured_main test_with_self 156