1# Copyright 2002-2019 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 17if { ![support_displaced_stepping] } { 18 unsupported "displaced stepping" 19 return -1 20} 21 22load_lib mi-support.exp 23set MIFLAGS "-i=mi" 24 25gdb_exit 26 27save_vars { GDBFLAGS } { 28 append GDBFLAGS " -ex \"set non-stop on\"" 29 if {[mi_gdb_start]} { 30 continue 31 } 32} 33 34proc mi_nonstop_resume { command test } { 35 if { [mi_send_resuming_command $command $test] != 0 } { 36 # If a resume fails, assume non-stop is broken or unsupported 37 # for this target. We have logged a FAIL or UNSUPPORTED; skip 38 # the remaining tests to limit timeouts. 39 return -code continue 40 } 41} 42 43# 44# Start here 45# 46standard_testfile non-stop.c 47 48set options [list debug] 49if {[gdb_compile_pthreads "$srcdir/$subdir/$srcfile" $binfile executable $options] != "" } { 50 return -1 51} 52 53mi_gdb_reinitialize_dir $srcdir/$subdir 54mi_gdb_load $binfile 55 56mi_gdb_test "-gdb-set mi-async 1" ".*" 57mi_detect_async 58 59if { [mi_run_to_main] < 0 } { 60 continue 61} 62 63mi_create_breakpoint break_at_me "breakpoint at marker" \ 64 -number 2 -func break_at_me 65 66mi_nonstop_resume "exec-continue" "resume 1" 67mi_expect_stop "breakpoint-hit" "break_at_me" ".*" "non-stop.c" ".*" {"" "disp=\"keep\""} "w0,i0 stop" 68mi_expect_stop "breakpoint-hit" "break_at_me" ".*" "non-stop.c" ".*" {"" "disp=\"keep\""} "w1,i0 stop" 69 70mi_check_thread_states {"running" "stopped" "stopped"} "thread state, stop 1" 71 72mi_gdb_test "-thread-select 2" "\\^done.*" "select thread 2" 73mi_create_varobj I_W0 "i" "create varobj in first thread" 74mi_gdb_test "-thread-select 3" "\\^done.*" "select thread 3" 75mi_create_varobj I_W1 "i" "create varobj in second thread" 76 77mi_nonstop_resume "exec-continue --thread 2" "resume 1" 78mi_check_thread_states {"running" "running" "stopped"} "thread state, resume 1" 79mi_expect_stop "breakpoint-hit" "break_at_me" ".*" "non-stop.c" ".*" {"" "disp=\"keep\""} "w0,i1 stop" 80mi_check_thread_states {"running" "stopped" "stopped"} "thread state, stop 2" 81 82mi_nonstop_resume "exec-continue --thread 3" "resume 2" 83mi_check_thread_states {"running" "stopped" "running"} "thread state, resume 2" 84mi_expect_stop "breakpoint-hit" "break_at_me" ".*" "non-stop.c" ".*" {"" "disp=\"keep\""} "w1,i1 stop" 85mi_check_thread_states {"running" "stopped" "stopped"} "thread state, stop 3" 86 87mi_varobj_update * {I_W1 I_W0} "update varobj, 1" 88mi_check_varobj_value I_W0 1 "check varobj, w0, 1" 89mi_check_varobj_value I_W1 1 "check varobj, w1, 1" 90 91mi_gdb_test "-exec-interrupt --thread 1" "\\^done" "interrupted" 92mi_expect_interrupt "got interrupt" 93 94# The interrupt command sends SIGINT to the target, and therefore the 95# thread might not be stopped immediately when we return from the target. 96# So, wait a bit 97sleep 1 98mi_check_thread_states {"stopped" "stopped" "stopped"} "thread state, stop 4" 99 100mi_gdb_test "-exec-continue --all" ".*\\*running,thread-id=\"1\"\r\n\\*running,thread-id=\"2\"\r\n\\*running,thread-id=\"3\"" \ 101 "resume all" 102 103mi_expect_stop "breakpoint-hit" "break_at_me" "\[^\n\]*" "non-stop.c" "\[0-9\]*" {"" "disp=\"keep\""} "w0,i2 stop" 104mi_expect_stop "breakpoint-hit" "break_at_me" ".*" "non-stop.c" ".*" {"" "disp=\"keep\""} "w1,i2 stop" 105 106# At this point, thread 1 (main) is running, and worker threads are stopped. 107# Check that we can modify breakpoint condition, even when operating on a 108# running thread. 109mi_gdb_test "-break-condition --thread 1 2 id==1" "\\^done" "set condition, 1" 110 111mi_nonstop_resume "exec-continue --thread 2" "resume 2" 112mi_nonstop_resume "exec-continue --thread 3" "resume 3" 113 114sleep 2 115mi_expect_stop "breakpoint-hit" "break_at_me" ".*" "non-stop.c" ".*" {"" "disp=\"keep\""} "w0,i3 stop" 116mi_check_thread_states {"running" "running" "stopped"} "thread state, stop on cond breakpoint" 117 118# Check that when we update all varobj, we don't get no error about varobj 119# bound to running thread. 120mi_varobj_update * {I_W1} "update varobj, 2" 121mi_check_varobj_value I_W1 3 "check varobj, w1, 1" 122 123 124# Check that stack commands are allowed on a stopped thread, even if some other threads 125# are running, and produce something sane. Also check we check error on running thread. 126mi_gdb_test "-stack-list-frames --thread 2" "\\^error,msg=\".*\"" "stacktrace of running thread" 127mi_gdb_test "-stack-list-frames --thread 3" \ 128 "\\^done,stack=\\\[frame={level=\"0\",addr=\".*\",func=\"break_at_me\".*" \ 129 "stacktrace of stopped thread" 130 131# verify that after thread exit, the thread is reported as exited in -thread-info, and 132# we can still interact with other threads. 133mi_gdb_test "-thread-select 2" "\\^done.*" "select first worker thread" 134# Since thread 2 is running, we need to set variable via another thread. 135mi_gdb_test "-gdb-set --thread 3 variable exit_first_thread=1" ".*\\^done" "ask the second thread to exit" 136 137set test "wait for thread exit" 138if { [mi_is_target_remote] } { 139 # The remote protocol doesn't have support for thread exit 140 # notifications. 141 unsupported $test 142} else { 143 gdb_expect { 144 -re ".*=thread-exited,id=\"2\",group-id=\"i\[0-9\]+\"\r\n$" { 145 pass $test 146 } 147 timeout { 148 fail "$test (timeout)" 149 } 150 } 151} 152 153# See that we can still poke other threads. 154mi_gdb_test "-stack-list-frames --thread 3" \ 155 "\\^done,stack=\\\[frame={level=\"0\",addr=\".*\",func=\"break_at_me\".*" \ 156 "stacktrace of stopped thread" 157 158mi_gdb_exit 159