1 # Copyright (C) 2015-2024 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 test spawns a few threads that constantly trip on a breakpoint 17 # that does not cause a user-visible stop. While one of those 18 # breakpoints is being handled, the main thread exits the whole 19 # process. The result is that the current thread for which GDB is 20 # handling the event disappears too and any attempt to access 21 # register/memory now errors out. GDB and GDBserver should be able to 22 # handle this scenario gracefully. 23 # 24 # See https://sourceware.org/bugzilla/show_bug.cgi?id=18749 25 26 standard_testfile 27 28 set linenum [gdb_get_line_number "set break here"] 29 30 if {[build_executable "failed to prepare" $testfile $srcfile {debug pthreads}] == -1} { 31 return -1 32 } 33 34 # The test proper. If COND_BP_TARGET is true, then test with 35 # conditional breakpoints evaluated on the target side, if possible. 36 37 proc do_test { non_stop cond_bp_target } { 38 global GDBFLAGS 39 global gdb_prompt 40 global binfile 41 global linenum 42 43 save_vars { GDBFLAGS } { 44 set GDBFLAGS [concat $GDBFLAGS " -ex \"set non-stop $non_stop\""] 45 clean_restart $binfile 46 } 47 48 if {![runto_main]} { 49 return 0 50 } 51 52 # Whether it's known that the test fails. 53 set should_kfail 0 54 55 if {![gdb_protocol_is_remote]} { 56 set should_kfail 1 57 } else { 58 if {!$cond_bp_target} { 59 # Leaving breakpoint evaluation to GDB exposes failures 60 # similar to native debugging. 61 gdb_test \ 62 "set remote conditional-breakpoints-packet off" \ 63 "Support for the 'ConditionalBreakpoints' packet on the current remote target is set to \"off\"." 64 65 set should_kfail 1 66 } else { 67 set test "show remote conditional-breakpoints-packet" 68 gdb_test_multiple $test $test { 69 -re "\, currently enabled.*\r\n$gdb_prompt $" { 70 pass $test 71 } 72 -re "\, currently disabled.*\r\n$gdb_prompt $" { 73 unsupported "no support for target-side conditional breakpoints" 74 return 75 } 76 } 77 set should_kfail 1 78 } 79 } 80 81 gdb_test "break $linenum if zero == 1" \ 82 "Breakpoint .*" \ 83 "set breakpoint that evals false" 84 85 set test "continue &" 86 gdb_test_multiple $test $test { 87 -re "$gdb_prompt " { 88 pass $test 89 } 90 } 91 92 set ok 0 93 94 # Setup the kfail upfront in order to also catch GDB internal 95 # errors. 96 if {$should_kfail} { 97 setup_kfail "gdb/18749" "*-*-*" 98 } 99 100 set test "inferior 1 exited" 101 gdb_test_multiple "" $test { 102 -re "Inferior 1 \(\[^\r\n\]+\) exited normally" { 103 set ok 1 104 105 # Clear the kfail to avoid a PASS -> KPASS dance across 106 # runs. 107 clear_kfail "*-*-linux*" 108 109 pass $test 110 } 111 -re "$gdb_prompt " { 112 # Several errors end up at the top level, and printing the 113 # prompt. 114 fail "$test (prompt)" 115 } 116 -re "Cannot access memory" { 117 fail "$test (memory error)" 118 } 119 eof { 120 fail "$test (GDB died)" 121 } 122 } 123 124 if {!$ok} { 125 # No use testing further. 126 return 127 } 128 129 gdb_test "info threads" "No threads\." \ 130 "no threads left" 131 } 132 133 foreach_with_prefix non_stop {"on" "off"} { 134 foreach_with_prefix cond_bp_target {1 0} { 135 do_test $non_stop $cond_bp_target 136 } 137 } 138