1# Copyright 2009-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 16if [target_info exists gdb,nosignals] { 17 verbose "Skipping sigall-precsave.exp because of nosignals." 18 return 19} 20 21if ![supports_reverse] { 22 return 23} 24 25 26gdb_exit 27gdb_start 28gdb_reinitialize_dir $srcdir/$subdir 29 30standard_testfile sigall-reverse.c 31set precsave [standard_output_file sigall.precsave] 32 33if {[build_executable $testfile.exp $testfile $srcfile debug] == -1} { 34 return -1 35} 36 37proc test_one_sig {nextsig} { 38 global sig_supported 39 global gdb_prompt 40 global thissig 41 42 set this_sig_supported $sig_supported 43 gdb_test "handle SIG$thissig stop print" \ 44 "SIG$thissig\[ \t\]*Yes\[ \t\]*Yes\[ \t\]*Yes.*" 45 gdb_test "b handle_$thissig" "Breakpoint \[0-9\]+ .*" 46 gdb_test "b gen_$nextsig" "Breakpoint \[0-9\]+ .*" 47 48 set need_another_continue 1 49 set missed_handler 0 50 if $this_sig_supported then { 51 if { $thissig == "IO" } { 52 setup_xfail "i*86-pc-linuxoldld-gnu" "i*86-pc-linuxaout-gnu" 53 } 54 set testmsg "get signal $thissig" 55 gdb_test_multiple "continue" $testmsg { 56 -re "Program received signal SIG$thissig.*handle_$thissig.*$gdb_prompt $" { 57 fail "$testmsg (wrong location)" 58 } 59 -re "Program received signal SIG$thissig.*$gdb_prompt $" { 60 pass $testmsg 61 } 62 -re "Breakpoint.* handle_$thissig.*$gdb_prompt $" { 63 xfail $testmsg 64 set need_another_continue 0 65 } 66 } 67 } 68 69 if $need_another_continue then { 70 if { $thissig == "URG" } { 71 setup_xfail "i*86-pc-linuxoldld-gnu" "i*86-pc-linuxaout-gnu" 72 } 73 # Either Lynx or GDB screws up on SIGPRIO 74 if { $thissig == "PRIO" } { 75 setup_xfail "*-*-*lynx*" 76 } 77 set testmsg "send signal $thissig" 78 gdb_test_multiple "continue" $testmsg { 79 -re "Breakpoint.*handle_$thissig.*$gdb_prompt $" { 80 pass $testmsg 81 } 82 -re "Breakpoint.*gen_$nextsig.*kill.*$gdb_prompt $" { 83 fail "missed breakpoint at handle_$thissig" 84 set missed_handler 1 85 } 86 } 87 } 88 89 if { $missed_handler == "0" } then { 90 set testmsg "advance to $nextsig" 91 gdb_test_multiple "signal 0" $testmsg { 92 -re "Breakpoint.*gen_$nextsig.*kill.*$gdb_prompt $" { 93 pass $testmsg 94 set sig_supported 1 95 } 96 -re "Breakpoint.*gen_$nextsig.*handle.*$gdb_prompt $" { 97 pass $testmsg 98 set sig_supported 0 99 } 100 } 101 } 102 set thissig $nextsig 103} 104 105proc test_one_sig_reverse {prevsig} { 106 global gdb_prompt 107 108 gdb_test "reverse-continue" "Breakpoint .* handle_$prevsig.*" \ 109 "reverse to handler of $prevsig" 110 111 set saw_signal 0 112 set testmsg "reverse to gen_$prevsig" 113 gdb_test_multiple "reverse-continue" $testmsg { 114 -re "Breakpoint.*handle_.*$gdb_prompt " { 115 pass "$testmsg (un-handled)" 116 } 117 -re "Program received signal SIG$prevsig.*$gdb_prompt " { 118 pass "reverse to signal event, $prevsig" 119 120 set nested_testmsg "reverse signal $prevsig delivered" 121 gdb_test_multiple "frame" $nested_testmsg { 122 -re ".*handle_$prevsig.*$gdb_prompt " { 123 fail "$nested_testmsg (wrong location)" 124 } 125 -re ".*$gdb_prompt " { 126 pass $nested_testmsg 127 } 128 } 129 130 set saw_signal 1 131 send_gdb "reverse-continue\n" 132 exp_continue 133 } 134 -re "Breakpoint.*kill.*$gdb_prompt " { 135 if { $saw_signal } then { 136 pass "$testmsg (handled)" 137 } else { 138 xfail "$testmsg (handled)" 139 } 140 } 141 -re "No more reverse-execution history.*kill.*$gdb_prompt " { 142 if { $saw_signal } then { 143 pass "$testmsg (handled)" 144 } else { 145 xfail "$testmsg (handled)" 146 } 147 } 148 } 149} 150 151gdb_load $binfile 152 153runto gen_ABRT 154 155if [supports_process_record] { 156 # Activate process record/replay 157 gdb_test_no_output "record" "turn on process record" 158} 159 160# Run until end, then save execution log. 161 162set breakloc [gdb_get_line_number "end of main" "$srcfile"] 163gdb_test "break $breakloc" \ 164 "Breakpoint $decimal at .*$srcfile, line $breakloc\." \ 165 "breakpoint at end of main" 166 167# Signal handlers must be disabled 168gdb_test "handle all nostop noprint" 169 170# The list of signals that the program generates, in the order they 171# are generated. 172set signals { 173 ABRT 174 HUP 175 QUIT 176 ILL 177 EMT 178 FPE 179 BUS 180 SEGV 181 SYS 182 PIPE 183 ALRM 184 URG 185 TSTP 186 CONT 187 CHLD 188 TTIN 189 TTOU 190 IO 191 XCPU 192 XFSZ 193 VTALRM 194 PROF 195 WINCH 196 LOST 197 USR1 198 USR2 199 PWR 200 POLL 201 WIND 202 PHONE 203 WAITING 204 LWP 205 DANGER 206 GRANT 207 RETRACT 208 MSG 209 SOUND 210 SAK 211 PRIO 212 33 213 34 214 35 215 36 216 37 217 38 218 39 219 40 220 41 221 42 222 43 223 44 224 45 225 46 226 47 227 48 228 49 229 50 230 51 231 52 232 53 233 54 234 55 235 56 236 57 237 58 238 59 239 60 240 61 241 62 242 63 243 TERM 244} 245 246# Software single-step targets can't step into signal handlers. Since 247# later, when replaying the execution log, the test wants to set 248# breakpoints on handlers, we need to make sure that while recording, 249# GDB steps through the handlers too, so that the execution log covers 250# them. Setting breakpoints in all handlers takes care of it. This 251# is harmless for hardware-step targets. 252foreach sig $signals { 253 set test "break *handle_$sig" 254 gdb_test_multiple $test $test { 255 -re "Breakpoint .*$gdb_prompt $" { 256 # No need to record a pass for each breakpoint. 257 } 258 } 259} 260 261gdb_test_multiple "continue" "run to end of main" { 262 -wrap -re "Breakpoint .* end of main .*" { 263 pass $gdb_test_name 264 } 265 -wrap -re "Breakpoint .* handle_.*" { 266 send_gdb "continue\n" 267 exp_continue 268 } 269 -wrap -re "Process record does not support instruction 0xfae64 at.*" { 270 kfail "gdb/25038" $gdb_test_name 271 return -1 272 } 273} 274 275delete_breakpoints 276 277gdb_test "record save $precsave" \ 278 "Saved core file $precsave with execution log\." \ 279 "save process recfile" 280 281gdb_test "kill" "" "kill process, prepare to debug log file" \ 282 "Kill the program being debugged\\? \\(y or n\\) " "y" 283 284gdb_test "record restore $precsave" \ 285 "Restored records from core file .*" \ 286 "reload precord save file" 287 288# Signal handlers must be re-enabled 289gdb_test "handle all stop print" 290 291# Make the first signal SIGABRT because it is always supported. 292set sig_supported 1 293set thissig "ABRT" 294 295# test signal handling 296with_test_prefix "sig-test-1" { 297 foreach sig [lrange $signals 1 end] { 298 test_one_sig $sig 299 } 300} 301 302# The last signal (SIGTERM) gets handled slightly differently because 303# we are not setting up for another test. 304gdb_test "handle SIGTERM stop print" \ 305 "SIGTERM\[ \t\]*Yes\[ \t\]*Yes\[ \t\]*Yes.*" 306gdb_test "b handle_TERM" "Breakpoint \[0-9\]+ .*" 307gdb_test "continue" \ 308 "Continuing.*Program received signal SIGTERM.*" \ 309 "get signal TERM" 310gdb_test "continue" "Breakpoint.*handle_TERM.*" "send signal TERM" 311 312gdb_test "continue" " end of main .*" "continue to sigall exit" 313 314foreach sig [lreverse $signals] { 315 test_one_sig_reverse $sig 316} 317 318# Make the first signal SIGABRT because it is always supported. 319set sig_supported 1 320set thissig "ABRT" 321 322with_test_prefix "sig-test-2" { 323 foreach sig [lrange $signals 1 end] { 324 test_one_sig $sig 325 } 326} 327