Files
binutils-gdb/gdb/testsuite/gdb.threads/break-while-running.exp
Andrew Burgess 1d506c26d9 Update copyright year range in header of all files managed by GDB
This commit is the result of the following actions:

  - Running gdb/copyright.py to update all of the copyright headers to
    include 2024,

  - Manually updating a few files the copyright.py script told me to
    update, these files had copyright headers embedded within the
    file,

  - Regenerating gdbsupport/Makefile.in to refresh it's copyright
    date,

  - Using grep to find other files that still mentioned 2023.  If
    these files were updated last year from 2022 to 2023 then I've
    updated them this year to 2024.

I'm sure I've probably missed some dates.  Feel free to fix them up as
you spot them.
2024-01-12 15:49:57 +00:00

163 lines
5.3 KiB
Plaintext

# Copyright (C) 2014-2024 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/>.
# Test that:
#
# - setting a breakpoint while a thread is running results in the
# breakpoint being inserted immediately.
#
# - if breakpoint always-inserted mode is off, GDB doesn't remove
# breakpoints from the target when a thread stops, if there are
# still threads running.
standard_testfile
if {[build_executable "failed to prepare" $testfile $srcfile {debug pthreads}] == -1} {
return -1
}
# The test proper. UPDATE_THREAD_LIST indicates whether we should do
# an "info threads" to sync the thread list after the first stop.
# ALWAYS_INSERTED indicates whether testing in "breakpoint
# always-inserted" mode. NON_STOP indicates whether we're testing in
# non-stop, or all-stop mode.
proc test { update_thread_list always_inserted non_stop } {
global srcfile binfile
global gdb_prompt
global decimal
clean_restart $binfile
gdb_test_no_output "set non-stop $non_stop"
gdb_test_no_output "set breakpoint always-inserted $always_inserted"
if ![runto_main] {
return -1
}
# In all-stop, check whether we're testing with the remote or
# extended-remote targets. If so, skip the tests, as with the
# RSP, we can't issue commands until the target replies to vCont.
# Not an issue with the non-stop RSP variant, which has a
# non-blocking vCont.
if {$non_stop=="off" && [gdb_is_target_remote]} {
return -1
}
gdb_breakpoint [gdb_get_line_number "set wait-thread breakpoint here"]
gdb_continue_to_breakpoint "run to wait-thread breakpoint"
delete_breakpoints
# Leave the main thread stopped, so GDB can poke at memory freely.
if {$non_stop == "off"} {
gdb_test_no_output "set scheduler-locking on"
gdb_test "thread 2" "Switching to .*"
gdb_test "continue &" "Continuing\." "continuing thread 2"
gdb_test "thread 3" "Switching to .*"
gdb_test "continue &" "Continuing\." "continuing thread 3"
gdb_test "thread 1" "Switching to .*" "switch back to main thread"
}
# Test with and without pulling the thread list explicitly with
# "info threads". GDB should be able to figure out itself whether
# the target is running and thus breakpoints should be inserted,
# without the user explicitly fetching the thread list.
if {$update_thread_list} {
gdb_test "info threads" \
"main .*\\\(running\\\).*\\\(running\\\).*" \
"only main stopped"
}
# Don't use gdb_test as it's racy in this case -- gdb_test matches
# the prompt with an end anchor. Sometimes expect will manage to
# read the breakpoint hit output while still processing this test,
# defeating the anchor.
set test "set breakpoint while a thread is running"
gdb_test_multiple "break breakpoint_function" $test {
-re "Breakpoint $decimal at .*: file .*$srcfile.*\r\n$gdb_prompt " {
pass $test
}
-re "$gdb_prompt " {
fail $test
}
}
# Check that the breakpoint is hit. Can't use gdb_test here, as
# no prompt is expected to come out.
set test "breakpoint is hit"
gdb_test_multiple "" $test {
-re "Breakpoint .*, breakpoint_function \[^\r\n\]+" {
pass $test
}
}
if {$non_stop == "on"} {
gdb_test "info threads" \
"main .* breakpoint_function .*\\\(running\\\)" \
"one thread running"
# Unblock the other thread, which should then trip on the same
# breakpoint, unless GDB removed it by mistake. Can't use
# gdb_test here for the same reasons as above.
set test "unblock second thread"
gdb_test_multiple "print second_child = 1" $test {
-re " = 1\r\n$gdb_prompt " {
pass $test
}
-re "$gdb_prompt " {
fail $test
}
}
set test "breakpoint on second child is hit"
gdb_test_multiple "" $test {
-re "Breakpoint .*, breakpoint_function \[^\r\n\]+" {
pass $test
}
}
gdb_test "info threads" \
" main .* breakpoint_function .* breakpoint_function .*" \
"all threads stopped"
} else {
# This test is not merged with the non-stop one because in
# all-stop we don't know where the other thread stops (inside
# usleep, for example).
set test "all threads stopped"
gdb_test_multiple "info threads" "$test" {
-re "\\\(running\\\).*$gdb_prompt $" {
fail $test
}
-re "main .* breakpoint_function .*$gdb_prompt $" {
pass $test
}
}
}
}
foreach update_thread_list { true false } {
foreach always_inserted { "off" "on" } {
foreach non_stop { "off" "on" } {
set stop_mode [expr ($non_stop=="off")?"all-stop":"non-stop"]
set update_list_mode [expr ($update_thread_list)?"w/ithr":"wo/ithr"]
with_test_prefix "$update_list_mode: always-inserted $always_inserted: $stop_mode" {
test $update_thread_list $always_inserted $non_stop
}
}
}
}