Files
binutils-gdb/gdb/testsuite/gdb.threads/forking-threads-plus-breakpoint.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

168 lines
4.7 KiB
Plaintext

# Copyright (C) 2015-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/>.
# This test verifies that several threads forking while another thread
# is constantly stepping over a breakpoint is properly handled.
standard_testfile
set linenum [gdb_get_line_number "set break here"]
if {[build_executable "failed to prepare" $testfile $srcfile {debug pthreads}] == -1} {
return -1
}
# Assume yes.
set displaced_stepping_supported 1
# "set displaced on" only tells gdb to use displaced stepping if
# possible. Probe for actual support.
proc probe_displaced_stepping_support {} {
global displaced_stepping_supported
global binfile gdb_prompt
with_test_prefix "probe displaced-stepping support" {
clean_restart $binfile
gdb_test_no_output "set displaced on"
if {![runto_main]} {
return 0
}
# We're stopped at the main breakpoint. If displaced stepping is
# supported, we'll see related debug output while we step past
# that breakpoint.
gdb_test_no_output "set debug displaced 1"
gdb_test_multiple "next" "probe" {
-re "prepared successfully .*$gdb_prompt $" {
pass "supported"
}
-re ".*$gdb_prompt $" {
set displaced_stepping_supported 0
pass "not supported"
}
}
}
}
# The test proper. If COND_BP_TARGET is true, then test with
# conditional breakpoints evaluated on the target side, if possible.
# DETACH_ON_FORK is used as value for the "set detach-on-fork"
# setting. If "on", this exercises GDB explicitly continuing the fork
# child until exit. If "off", this exercises GDB detaching the fork
# child. DISPLACED indicates whether to use displaced stepping or
# not.
proc do_test { cond_bp_target detach_on_fork displaced } {
global GDBFLAGS
global srcfile testfile binfile
global decimal gdb_prompt
global linenum
global is_remote_target
set saved_gdbflags $GDBFLAGS
set GDBFLAGS [concat $GDBFLAGS " -ex \"set non-stop on\""]
clean_restart $binfile
set GDBFLAGS $saved_gdbflags
if {![runto_main]} {
return 0
}
if {$cond_bp_target} {
set test "set breakpoint condition-evaluation target"
gdb_test_multiple $test $test {
-re "warning: Target does not support breakpoint condition evaluation.\r\nUsing host evaluation mode instead.\r\n$gdb_prompt $" {
# Target doesn't support breakpoint condition
# evaluation on its side. Skip the test.
return 0
}
-re "^$test\r\n$gdb_prompt $" {
}
}
} else {
gdb_test_no_output "set breakpoint condition-evaluation host"
}
gdb_test_no_output "set detach-on-fork $detach_on_fork"
gdb_test_no_output "set displaced $displaced"
gdb_test "break $linenum if zero == 1" \
"Breakpoint .*" \
"set breakpoint that evals false"
set test "continue &"
gdb_test_multiple $test $test {
-re "$gdb_prompt " {
pass $test
}
}
set fork_count 0
set ok 0
with_timeout_factor 10 {
set test "inferior 1 exited"
gdb_test_multiple "" $test {
-re "Inferior 1 \(\[^\r\n\]+\) exited normally" {
set ok 1
pass $test
}
-re "Inferior $decimal \(\[^\r\n\]+\) exited normally" {
incr fork_count
if {$fork_count <= 100} {
exp_continue
} else {
fail "$test (too many forks)"
}
}
}
}
if {!$ok} {
# No use testing further.
return
}
gdb_test "info threads" "No threads\." \
"no threads left"
gdb_test "info inferiors" \
"Num\[ \t\]+Description\[ \t\]+Connection\[ \t\]+Executable\[ \t\]+\r\n\\* 1 \[^\r\n\]+" \
"only inferior 1 left"
}
probe_displaced_stepping_support
foreach_with_prefix cond_bp_target {1 0} {
foreach_with_prefix detach_on_fork {"on" "off"} {
# Disable "off" for now. The test does pass with
# detach-on-fork off (at the time of writing), but gdb seems
# to slow down quadratically as inferiors are created, and
# then the test takes annoyingly long to complete...
if {$detach_on_fork == "off"} {
continue
}
foreach_with_prefix displaced {"on" "off"} {
if {$displaced == "on" && !$displaced_stepping_supported} {
continue
}
do_test $cond_bp_target $detach_on_fork $displaced
}
}
}