# Copyright 2012-2021 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 3 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, see . if [target_info exists gdb,nosignals] { verbose "Skipping catch-signal.exp because of nosignals." continue } standard_testfile if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} { return -1 } proc test_catch_signal {signame} { global srcfile with_test_prefix $signame { if {![runto_main]} { return -1 } # Test "catch signal" without arguments. # Don't let the signal be handled otherwise. gdb_breakpoint ${srcfile}:[gdb_get_line_number "first HUP"] gdb_continue_to_breakpoint "first HUP" gdb_test "handle SIGHUP nostop noprint pass" \ "SIGHUP.*No.*No.*Yes.*" gdb_test "catch signal" "Catchpoint .*" gdb_test "continue" "Catchpoint .*" # Now ensure that the "pass" setting worked, and also that we did not # see gdb's SIGTRAP. gdb_breakpoint ${srcfile}:[gdb_get_line_number "handle marker"] gdb_continue_to_breakpoint "handle marker" delete_breakpoints # Catch just $SIGNAME. gdb_breakpoint ${srcfile}:[gdb_get_line_number "second HUP"] gdb_continue_to_breakpoint "second HUP" gdb_test "catch signal $signame" "Catchpoint .*" gdb_test "continue" "Catchpoint .*" delete_breakpoints # Catch just SIGUSR1 -- but it isn't sent. gdb_breakpoint ${srcfile}:[gdb_get_line_number "third HUP"] gdb_continue_to_breakpoint "third HUP" gdb_test "handle SIGUSR1 nostop noprint pass" \ "SIGUSR1.*No.*No.*Yes.*" gdb_test "catch signal SIGUSR1" "Catchpoint .*" # Also verify that if we set SIGHUP to "nopass", then it is # still not delivered. gdb_breakpoint ${srcfile}:[gdb_get_line_number "handle marker"] gdb_test "handle SIGHUP nostop noprint nopass" \ "SIGHUP.*No.*No.*No.*" gdb_breakpoint ${srcfile}:[gdb_get_line_number "fourth HUP"] gdb_continue_to_breakpoint "fourth HUP" delete_breakpoints # Verify an internal signal used by gdb is properly caught. gdb_breakpoint ${srcfile}:[gdb_get_line_number "first INT"] gdb_continue_to_breakpoint "first INT" set test "override SIGINT to catch" gdb_test "handle SIGINT nostop print nopass" \ "SIGINT.*No.*Yes.*No.*" \ "$test" \ "SIGINT is used by the debugger.*Are you sure you want to change it.*y or n.*" \ y gdb_test "catch signal SIGINT" "Catchpoint .*" gdb_test "continue" "Catchpoint .* SIGINT.*" } } # Test with symbolic signal. test_catch_signal SIGHUP # Test with numeric signal. clean_restart $testfile test_catch_signal 1 # Test with two signals in catchpoint. clean_restart $testfile test_catch_signal "SIGHUP SIGUSR2" # # Coverage tests. # gdb_test "catch signal SIGZARDOZ" "Unknown signal name 'SIGZARDOZ'." gdb_test "catch signal all" "Catchpoint .*" gdb_test "catch signal all SIGHUP" "'all' cannot be caught with other signals" gdb_test "catch signal SIGHUP all" "'all' cannot be caught with other signals" set i 0 foreach {arg desc} {"" "standard signals" \ SIGHUP SIGHUP \ "SIGHUP SIGUSR2" "SIGHUP SIGUSR2" \ all "any signal"} { delete_breakpoints gdb_test "catch signal $arg" "Catchpoint .*" \ "set catchpoint '$arg' for printing" gdb_test "info break" "$decimal.*catchpoint.*signal.*$desc.*" \ "info break for '$arg'" gdb_breakpoint "main" gdb_test "save breakpoints [standard_output_file bps.$i]" \ "Saved to file .*bps.$i.*" \ "save breakpoints for '$arg'" set filename [remote_upload host [standard_output_file bps.$i] \ [standard_output_file bps-local.$i]] set fd [open $filename] set file_data [read $fd] set data [split $file_data "\n"] close $fd if {$arg == ""} { set pattern "catch signal" } else { set pattern "catch signal $arg" } gdb_assert {[expr [llength $data] == 3]} \ "Number of lines of save breakpoints for '$arg'" # Check the first line. gdb_assert {[string match $pattern [lindex $data 0]]} \ "1st line of save breakpoints for '$arg'" # Check the second line. gdb_assert {[string match "break main" [lindex $data 1]]} \ "2nd line of save breakpoints for '$arg'" # Check the trailing newline. gdb_assert {[string match "" [lindex $data 2]]} \ "Trailing newline of save breakpoints for '$arg'" incr i }