1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
|
# manythreads.exp -- Expect script to test stopping many threads
# Copyright (C) 2004-2015 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/>.
# This file was written by Jeff Johnston. (jjohnstn@redhat.com)
standard_testfile
set opts { debug }
if [info exists DEBUG] {
# make check RUNTESTFLAGS='gdb.threads/manythreads.exp DEBUG=1'
lappend opts "additional_flags=-DDEBUG"
}
if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable $opts] != "" } {
return -1
}
clean_restart ${binfile}
gdb_test_no_output "set print sevenbit-strings"
runto_main
# We'll need this when we send_gdb a ^C to GDB. Need to do it before we
# run the program and gdb starts saving and restoring tty states.
gdb_test "shell stty intr '^C'" ".*"
set message "first continue"
gdb_test_multiple "continue" "first continue" {
-re "error:.*$gdb_prompt $" {
fail "$message"
}
-re "Continuing" {
pass "$message"
}
}
# Wait one second. This is better than the TCL "after" command, because
# we don't lose GDB's output while we do it.
remote_expect host 1 { timeout { } }
# Send a Ctrl-C and wait for the SIGINT.
proc interrupt_and_wait { message } {
global gdb_prompt
send_gdb "\003"
gdb_test_multiple "" $message {
-re "\\\[New \[^\]\]*\\\]\r\n" {
exp_continue
}
-re "\\\[\[^\]\]* exited\\\]\r\n" {
exp_continue
}
-re "Program received signal SIGINT.*$gdb_prompt $" {
pass "$message"
}
-re "$gdb_prompt $" {
# Note that with this regex order, if GDB emits [New
# Thread ...] output between "Program received signal" and
# the prompt, the "Program received signal" regex won't
# match. That's good, as if we see that happening, it's a
# regression.
#
# GDB makes sure to notify about signal stops, end of
# stepping ranges, etc., only after updating the thread
# list, otherwise that stop info would be easy to miss.
#
# A BROKEN example would be:
#
# ... pages of new threads output ...
# [New Thread NNN]
# ^C
# ... more new threads output ...
# [New Thread NNN]
# [New Thread NNN]
# Program received signal SIGINT, Interrupt.
# [New Thread NNN]
# [New Thread NNN]
# ... pages of new threads output ...
# [Switching to Thread NNN]
# foo () at foo.c:31
# 31 bar ();
#
fail $message
}
}
}
# Send a Ctrl-C and verify that we can do info threads and continue
interrupt_and_wait "stop threads 1"
set cmd "info threads"
set ok 0
gdb_test_multiple $cmd $cmd {
-re " 1 *Thread " {
set ok 1
exp_continue
}
-re ".*\r\n" {
# Eat this line and continue, to prevent the buffer overflowing.
exp_continue
}
-re "$gdb_prompt $" {
if { $ok } {
pass $cmd
} else {
fail $cmd
}
}
}
gdb_test_no_output "thread name zardoz" "give a name to the thread"
gdb_test "info threads" ".*zardoz.*" "check thread name"
set message "second continue"
gdb_test_multiple "continue" "second continue" {
-re "error:.*$gdb_prompt $" {
fail "$message"
}
-re "Continuing" {
pass "$message"
}
}
# Wait another second. If the program stops on its own, GDB has failed
# to handle duplicate SIGINTs sent to multiple threads.
set failed 0
remote_expect host 1 {
-re "\\\[New \[^\]\]*\\\]\r\n" {
exp_continue -continue_timer
}
-re "\\\[\[^\]\]* exited\\\]\r\n" {
exp_continue -continue_timer
}
-re "Program received signal SIGINT.*$gdb_prompt $" {
if { $failed == 0 } {
fail "check for duplicate SIGINT"
}
send_gdb "continue\n"
set failed 1
exp_continue
}
timeout {
if { $failed == 0 } {
pass "check for duplicate SIGINT"
}
}
}
# Send another Ctrl-C and verify that we can do info threads and quit
interrupt_and_wait "stop threads 2"
gdb_test_multiple "quit" "GDB exits after stopping multithreaded program" {
-re "Quit anyway\\? \\(y or n\\) $" {
send_gdb "y\n"
exp_continue
}
eof {
pass "GDB exits after stopping multithreaded program"
}
timeout {
fail "GDB exits after stopping multithreaded program (timeout)"
}
}
|