
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.
87 lines
2.8 KiB
Text
87 lines
2.8 KiB
Text
# Copyright (C) 2009-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 a resume cancels a previously unfinished or unreported
|
|
# single-step correctly.
|
|
#
|
|
# The test consists of several threads all running the same loop.
|
|
# There is a breakpoint set in the loop, hence all threads may hit it.
|
|
# The test then issues several "next" commands in a loop.
|
|
#
|
|
# scheduler-locking must be set to the default of "off".
|
|
#
|
|
# Here's what would happen in gdbserver:
|
|
#
|
|
# 1) We issue a "continue", and wait until a thread hits the
|
|
# breakpoint. Could be any thread, but assume thread 1 hits it.
|
|
#
|
|
# 2) We issue a "next" --- this single-steps thread 1, and resumes all
|
|
# other threads.
|
|
#
|
|
# 3) thread 2, due to scheduler-locking off, hits the breakpoint.
|
|
# gdbserver stops all other threads by sending them SIGSTOPs.
|
|
#
|
|
# 4) While being stopped in step 3, thread 1 reports a SIGTRAP, that
|
|
# corresponds to the finished single-step of step 2. gdbserver
|
|
# leaves the SIGTRAP pending to report later.
|
|
#
|
|
# 5) We issue another "next" --- this requests thread 2 to
|
|
# single-step, and all other threads to continue, including thread
|
|
# 1. Before resuming any thread, gdbserver notices that it
|
|
# remembers from step 4 a pending SIGTRAP to report for thread 1,
|
|
# so reports it now.
|
|
#
|
|
# 6) From GDB's perpective, this SIGTRAP can't represent a finished
|
|
# single-step, since thread 1 was not single-stepping (it was
|
|
# continued in step 5). Neither does this SIGTRAP correspond to a
|
|
# breakpoint hit. GDB reports to the user a spurious SIGTRAP.
|
|
|
|
standard_testfile
|
|
|
|
if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable debug] != "" } {
|
|
return -1
|
|
}
|
|
|
|
clean_restart ${binfile}
|
|
|
|
if {![runto_main]} {
|
|
return 0
|
|
}
|
|
|
|
gdb_breakpoint [gdb_get_line_number "insert breakpoint here"]
|
|
gdb_continue_to_breakpoint "continue to first breakpoint hit"
|
|
|
|
set test "next in multiple threads with breakpoints"
|
|
set iterations 20
|
|
set ok 0
|
|
for {set i 0} {$i < $iterations} {incr i} {
|
|
set ok 0
|
|
gdb_test_multiple "next" "$test" {
|
|
-re " received signal SIGTRAP.*$gdb_prompt $" {
|
|
fail "$test (spurious SIGTRAP)"
|
|
}
|
|
-re "$gdb_prompt $" {
|
|
set ok 1
|
|
}
|
|
}
|
|
|
|
if { $ok == 0 } {
|
|
break
|
|
}
|
|
}
|
|
|
|
if { $ok } {
|
|
pass "$test"
|
|
}
|