1# Copyright (C) 2009-2023 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# Test that GDB doesn't get stuck when stepping over an exec call done 17# by a thread other than the main thread. 18 19standard_testfile 20 21if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" \ 22 executable debug] != "" } { 23 return -1 24} 25 26# Run the test proper. SCHEDLOCK specifies what scheduler-locking 27# should be set to. 28 29proc do_test { schedlock } { 30 global binfile 31 32 if {$schedlock == "non-stop"} { 33 set prefix $schedlock 34 } else { 35 set prefix "schedlock $schedlock" 36 } 37 with_test_prefix "$prefix" { 38 clean_restart ${binfile} 39 40 if {$schedlock == "non-stop"} { 41 gdb_test_no_output "set non-stop 1" 42 } 43 44 if ![runto_main] { 45 return 0 46 } 47 48 # Get ourselves to the thread that execs. 49 gdb_breakpoint "thread_execler" 50 gdb_test "continue" ".*thread_execler.*" "continue to thread start" 51 52 if {$schedlock == "non-stop"} { 53 gdb_test "thread 2" \ 54 "Switching to .*thread_execler.*" \ 55 "switch to event thread" 56 } 57 58 # Now set a breakpoint at `main', and step over the execl call. The 59 # breakpoint at main should be reached. GDB should not try to revert 60 # back to the old thread from the old image and resume stepping it 61 # (since it is gone). 62 gdb_breakpoint "main" 63 64 if {$schedlock != "non-stop"} { 65 gdb_test_no_output "set scheduler-locking $schedlock" 66 } 67 gdb_test "next" ".*main.*" "get to main in new image" 68 } 69} 70 71foreach schedlock {"off" "step" "on" "non-stop"} { 72 do_test $schedlock 73} 74