forked from Imagelibrary/binutils-gdb
The Windows port does not support multi-process debugging. Testcases that want to exercise multi-process currently FAIL and some hit cascading timeouts. Add a new allow_multi_inferior_tests procedure, meant to be used with require, and sprinkle it throughout testcases as needed. Approved-by: Kevin Buettner <kevinb@redhat.com> Change-Id: I4a10d8f04f9fa10f4b751f140ad0a6d31fbd9dfb
131 lines
4.2 KiB
Plaintext
131 lines
4.2 KiB
Plaintext
# Copyright 2023-2025 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/>.
|
|
|
|
# Check that GDB uses the correct thread-id when describing multiple
|
|
# thread specific breakpoints at the same location.
|
|
#
|
|
# Also check that the correct thread-ids are used in the saved
|
|
# breakpoints file.
|
|
|
|
require allow_multi_inferior_tests
|
|
|
|
# The plain remote target can't do multiple inferiors.
|
|
require !use_gdb_stub
|
|
|
|
standard_testfile
|
|
|
|
if {[prepare_for_testing "failed to prepare" $testfile $srcfile]} {
|
|
return -1
|
|
}
|
|
|
|
if {![runto_main]} {
|
|
return -1
|
|
}
|
|
|
|
delete_breakpoints
|
|
|
|
# Create a thread-specific b/p on main.
|
|
gdb_breakpoint "main thread 1"
|
|
set bpnum [get_integer_valueof "\$bpnum" "INVALID" \
|
|
"get number for thread specific b/p on main"]
|
|
|
|
# Check the b/p has a location and is displayed correctly.
|
|
gdb_test "info breakpoints" \
|
|
[multi_line \
|
|
"" \
|
|
"$bpnum\\s+breakpoint\\s+keep\\s+y\\s+$hex\\s+in main at \[^\r\n\]+/$srcfile:$decimal"\
|
|
"\\s+stop only in thread 1"] \
|
|
"check thread b/p on main has a location"
|
|
|
|
gdb_test "add-inferior -exec ${binfile}" "Added inferior 2.*" "add inferior 2"
|
|
gdb_test "inferior 2"
|
|
|
|
# The breakpoint should still have a location, but should now display
|
|
# information indicating this breakpoint is only in inferior 1.
|
|
gdb_test "info breakpoints" \
|
|
[multi_line \
|
|
"" \
|
|
"$bpnum\\s+breakpoint\\s+keep\\s+y\\s+$hex\\s+in main at \[^\r\n\]+/$srcfile:$decimal inf 1"\
|
|
"\\s+stop only in thread 1\\.1"] \
|
|
"check thread b/p on main still has updated correctly"
|
|
|
|
if {![runto_main]} {
|
|
return -1
|
|
}
|
|
|
|
gdb_test "info threads" \
|
|
[multi_line \
|
|
" Id\\s+Target Id\\s+Frame\\s*" \
|
|
" 1\\.1\\s+\[^\r\n\]+" \
|
|
"\\* 2\\.1\\s+\[^\r\n\]+"] \
|
|
"check we have the expected threads"
|
|
|
|
# Set the first breakpoint. Currently this is going to insert at two
|
|
# locations ('foo' in both inferiors) even though only one of those
|
|
# locations will ever trigger ('foo' in inferior 2).
|
|
gdb_test "break foo thread 2.1" \
|
|
"Breakpoint $decimal at $hex: file \[^\r\n\]+$srcfile, line $decimal\\."
|
|
|
|
set bpnum [get_integer_valueof "\$bpnum" "INVALID"]
|
|
|
|
# Now set another breakpoint that will be at the same location as the
|
|
# earlier breakpoint. Check that the thread-id used when describing
|
|
# the earlier breakpoints is correct.
|
|
gdb_test "break foo thread 1.1" \
|
|
"Breakpoint $decimal at $hex: file \[^\r\n\]+$srcfile, line $decimal\\."
|
|
|
|
# Save the breakpoints into a file.
|
|
if {[is_remote host]} {
|
|
set bps bps
|
|
} else {
|
|
set bps [standard_output_file bps]
|
|
}
|
|
|
|
remote_file host delete "$bps"
|
|
gdb_test "save breakpoints $bps" "" "save breakpoint to bps"
|
|
|
|
if {[is_remote host]} {
|
|
set bps [remote_upload host bps [standard_output_file bps]]
|
|
}
|
|
|
|
# Now dig through the saved breakpoints file and check that the
|
|
# thread-ids were written out correctly. First open the saved
|
|
# breakpoints and read them into a list.
|
|
set fh [open $bps]
|
|
set lines [split [read $fh] "\n"]
|
|
close $fh
|
|
|
|
# Except the list created from the saved breakpoints file will have a
|
|
# blank line entry at the end, so remove it now.
|
|
gdb_assert {[string equal [lindex $lines end] ""]} \
|
|
"check last item was an empty line"
|
|
set lines [lrange $lines 0 end-1]
|
|
|
|
# These are the lines we expect in the saved breakpoints file, in the
|
|
# order that we expect them. These are strings, not regexps.
|
|
set expected_results \
|
|
[list \
|
|
"break -qualified main" \
|
|
"break foo thread 2.1" \
|
|
"break foo thread 1.1"]
|
|
|
|
# Now check that the files contents (in LINES) matches the
|
|
# EXPECTED_RESULTS.
|
|
gdb_assert {[llength $lines] == [llength $expected_results]} \
|
|
"correct number of lines in saved breakpoints file"
|
|
foreach a $lines b $expected_results {
|
|
gdb_assert {[string equal $a $b]} "line '$b'"
|
|
}
|