1# Copyright 2004-2015 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 17# The program sigaltstack.c creates a backtrace containing nested 18# signal handlers on an alternative stack. This in turn leads to a 19# non-contiguous (and possibly non-monotonic) backtrace - stack 20# address jump at the normal-alt stack boundary. 21 22# This test confirms that GDB can both backtrace through and finish 23# such a stack. 24 25if [target_info exists gdb,nosignals] { 26 verbose "Skipping sigaltstack.exp because of nosignals." 27 continue 28} 29 30 31standard_testfile .c 32 33if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { 34 untested "Couldn't compile ${srcfile}.c" 35 return -1 36} 37 38# get things started 39clean_restart ${binfile} 40 41# Pass all the alarms straight through (but verbosely) 42gdb_test "handle SIGALRM print pass nostop" 43gdb_test "handle SIGVTALRM print pass nostop" 44gdb_test "handle SIGPROF print pass nostop" 45 46# Advance to main 47if { ![runto_main] } then { 48 gdb_suppress_tests 49} 50 51# Stop in handle, when at the inner most level 52gdb_test "break catcher if level == INNER" 53gdb_test "continue" ".* catcher .*" "continue to catch" 54# step off the assignment 55gdb_test "next" 56 57# Full backtrace? 58gdb_test_sequence "bt" "backtrace" { 59 "\[\r\n\]+.0 \[^\r\n\]* catcher " 60 "\[\r\n\]+.1 .signal handler called." 61 "\[\r\n\]+.2 \[^\r\n\]* thrower .next_level=INNER" 62 "\[\r\n\]+.3 \[^\r\n\]* catcher " 63 "\[\r\n\]+.4 .signal handler called." 64 "\[\r\n\]+.5 \[^\r\n\]* thrower .next_level=OUTER" 65 "\[\r\n\]+.6 \[^\r\n\]* catcher " 66 "\[\r\n\]+.7 \[^\r\n\]* main " 67} 68 69proc finish_test { pattern msg } { 70 global gdb_prompt 71 72 gdb_test_multiple "finish" $msg { 73 -re "Cannot insert breakpoint 0.*${gdb_prompt} $" { 74 # Some platforms use a special read-only page for signal 75 # trampolines. We can't set a breakpoint there, and we 76 # don't gracefully fall back to single-stepping. 77 setup_kfail gdb/8841 "i?86-*-linux*" 78 setup_kfail gdb/8841 "*-*-openbsd*" 79 fail "$msg (could not set breakpoint)" 80 } 81 -re "$pattern.*${gdb_prompt} $" { 82 pass $msg 83 } 84 } 85} 86 87# Finish? 88finish_test "signal handler called." "finish from catch LEAF" 89finish_test "thrower .next_level=INNER, .*" "finish to throw INNER" 90finish_test "catcher .*" "finish to catch INNER" 91finish_test "signal handler called.*" "finish from catch INNER" 92finish_test "thrower .next_level=OUTER, .*" "finish to OUTER" 93finish_test "catcher .*" "finish to catch MAIN" 94finish_test "main .*" "finish to MAIN" 95