mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-12 12:16:04 +08:00
4a94e36819
This commit brings all the changes made by running gdb/copyright.py as per GDB's Start of New Year Procedure. For the avoidance of doubt, all changes in this commits were performed by the script.
112 lines
3.3 KiB
Plaintext
112 lines
3.3 KiB
Plaintext
# This testcase is part of GDB, the GNU debugger.
|
|
|
|
# Copyright 2007-2022 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/>. */
|
|
|
|
# watch-thread_num.exp Test thread <thread_num> parameter for
|
|
# watch commands.
|
|
#
|
|
|
|
# This test verifies that a watchpoint is detected in the proper thread
|
|
# so the test is only meaningful on a system with hardware watchpoints.
|
|
# More specifically, the implementation of this test uses access
|
|
# watchpoints, so skip it when those are not available.
|
|
if {[skip_hw_watchpoint_access_tests]} {
|
|
return 0
|
|
}
|
|
|
|
standard_testfile .c
|
|
|
|
# What compiler are we using?
|
|
#
|
|
if [get_compiler_info] {
|
|
return -1
|
|
}
|
|
|
|
if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
|
|
return -1
|
|
}
|
|
|
|
clean_restart ${binfile}
|
|
|
|
if { ![runto_main] } then {
|
|
return
|
|
}
|
|
|
|
gdb_test "watch shared_var thread 0" "Invalid thread ID: 0" "watchpoint on invalid thread"
|
|
gdb_test "watch shared_var thread" "A syntax error in expression, near `thread'\." "invalid watch syntax"
|
|
|
|
set bpexitline [gdb_get_line_number "all threads started"]
|
|
gdb_breakpoint "$bpexitline"
|
|
gdb_continue_to_breakpoint "all threads started"
|
|
|
|
gdb_test "break loop" "Breakpoint \[0-9\].*" \
|
|
"Set breakpoint at loop"
|
|
|
|
gdb_test "continue" ".*Breakpoint .*loop.*" "stopped in loop"
|
|
|
|
gdb_test_multiple "thread" "thread command" {
|
|
-re ".*Current thread is (\[0-9\]*).*$gdb_prompt $" {
|
|
pass "thread command"
|
|
}
|
|
}
|
|
|
|
set thread_num "$expect_out(1,string)"
|
|
|
|
delete_breakpoints
|
|
|
|
# We use an access watchpoint rather than a write watchpoint, because
|
|
# GDB can drop the latter when multiple threads trigger events
|
|
# simultaneously, on targets with continuable watchpoints, such as
|
|
# x86. See PR breakpoints/10116.
|
|
|
|
gdb_test "awatch shared_var thread $thread_num" \
|
|
"Hardware access \\(read/write\\) watchpoint .*: shared_var.*" \
|
|
"watchpoint on shared variable"
|
|
|
|
gdb_test "info breakpoint \$bpnum" \
|
|
"stop only in thread $thread_num" \
|
|
"info breakpoint shows watchpoint is thread-specific"
|
|
|
|
# Uncomment to see additional information.
|
|
#gdb_test "set debug infrun 1"
|
|
|
|
for {set i 1} {$i <= 5} {incr i} {
|
|
set watchpoint "Watchpoint triggered iteration $i"
|
|
set check "Check thread that triggered iteration $i"
|
|
|
|
set test $watchpoint
|
|
set seen_watchpoint 0
|
|
gdb_test_multiple "continue" $test {
|
|
-re "Hardware access \\(read/write\\) watchpoint .*: shared_var" {
|
|
set seen_watchpoint 1
|
|
exp_continue
|
|
}
|
|
-re "$gdb_prompt " {
|
|
if { $seen_watchpoint } {
|
|
pass $test
|
|
} else {
|
|
fail $test
|
|
}
|
|
}
|
|
-re "\\\[infrun\\\] " {
|
|
# Avoid timeouts when debugging GDB.
|
|
exp_continue
|
|
}
|
|
}
|
|
gdb_test "thread" ".*Current thread is $thread_num .*" $check
|
|
}
|
|
|