| # Copyright 2008-2025 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 <http://www.gnu.org/licenses/>. |
| |
| require {!target_info exists gdb,nosignals} |
| |
| |
| # Some targets can't do function calls, so don't even bother with this |
| # test. |
| require {!target_info exists gdb,cannot_call_functions} |
| |
| standard_testfile |
| |
| if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} { |
| return -1 |
| } |
| |
| if { ![runto_main] } { |
| return 0 |
| } |
| |
| gdb_test "break stop_here" "Breakpoint \[0-9\]* at .*" |
| gdb_test "continue" "Continuing.*Breakpoint \[0-9\]*, stop_here.*" \ |
| "continue to breakpoint at stop_here" |
| |
| # Turn on unwind-on-signal. |
| gdb_test_no_output "set unwind-on-signal on" \ |
| "setting unwind-on-signal" |
| |
| gdb_test "show unwind-on-signal" \ |
| "Unwinding of stack .* is on." \ |
| "showing unwind-on-signal" |
| |
| # For backward compatibility we maintain a 'unwindonsignal' alias for |
| # 'unwind-on-signal', check it now. |
| gdb_test "show unwindonsignal" \ |
| "Unwinding of stack .* is on\\." \ |
| "showing unwindonsignal alias" |
| |
| gdb_test_no_output "set unwindonsignal off" \ |
| "setting unwindonsignal alias to off" |
| |
| gdb_test "show unwind-on-signal" \ |
| "Unwinding of stack .* is off\\." \ |
| "showing unwind-on-signal after setting via alias" |
| |
| gdb_test_no_output "set unwindonsignal on" \ |
| "setting unwindonsignal alias to on" |
| |
| # Call function (causing the program to get a signal), and see if gdb handles |
| # it properly. |
| if {[gdb_test "call gen_signal ()" \ |
| [multi_line \ |
| "The program being debugged received signal SIGABRT, Aborted" \ |
| "while in a function called from GDB\\. GDB has restored the context" \ |
| "to what it was before the call\\. To change this behavior use" \ |
| "\"set unwind-on-signal off\"\\. Evaluation of the expression containing" \ |
| "the function \\(gen_signal\\) will be abandoned\\."] \ |
| "unwindonsignal, inferior function call signaled"] != 0} { |
| return 0 |
| } |
| |
| # Verify the stack got unwound. |
| gdb_test "bt" \ |
| "#0 *\[x0-9a-f in\]*stop_here \\(.*\\) at .*#1 *\[x0-9a-f in\]*main \\(.*\\) at .*" \ |
| "stack unwound" |
| |
| # Verify the dummy frame got removed from dummy_frame_stack. |
| gdb_test_multiple "maint print dummy-frames" \ |
| "unwind-on-signal, dummy frame removed" { |
| -re "\[\r\n\]*.*stack=.*code=.*\[\r\n\]+$gdb_prompt $" { |
| fail $gdb_test_name |
| } |
| -re "\[\r\n\]+$gdb_prompt $" { |
| pass $gdb_test_name |
| } |
| } |