63fc80ce17
Since watch_thread_num.exp was changed to use access watchpoints, the test case fails on s390 and s390x, since those targets do not support access watchpoints. This patch skips the test case on such targets. gdb/testsuite/ChangeLog: * gdb.base/watch_thread_num.exp: Skip test on targets without access watchpoints.
100 lines
3.1 KiB
Text
100 lines
3.1 KiB
Text
# This testcase is part of GDB, the GNU debugger.
|
|
|
|
# Copyright 2007-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/>. */
|
|
|
|
# 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 {
|
|
fail "run to main"
|
|
return
|
|
}
|
|
|
|
gdb_test "watch shared_var thread 0" "Unknown thread 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"
|
|
|
|
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
|
|
gdb_test_multiple "continue" $test {
|
|
-re "infrun:" {
|
|
# Avoid timeouts when debugging GDB.
|
|
exp_continue
|
|
}
|
|
-re "Hardware access \\(read/write\\) watchpoint .*: shared_var.*$gdb_prompt $" {
|
|
pass $test
|
|
}
|
|
}
|
|
gdb_test "thread" ".*Current thread is $thread_num .*" $check
|
|
}
|
|
|