mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-15 04:31:49 +08:00
3d40fbb53b
Ref: https://sourceware.org/ml/gdb-patches/2015-08/msg00675.html If multiprocess extensions are off (because specific gdbserver port doesn't support them), then when gdbserver doesn't have a thread selected yet, and GDB sends Hg packet to select one, gdbserver crashes. That's because extracting the desired thread id out of the packet that GDB sent depends on the current thread to fill in the missing process id ... Fix this by getting the process id from the first (and only) process in the processes list instead. The GNU/Linux port doesn't trip on this because it always runs with multiprocess extensions enabled. To make it easier to catch such regressions going forward, this commit also adds a new smoke test that spawns gdbserver, connects to it and runs to main with the multiprocess extensions force-disabled. gdb/gdbserver/ChangeLog: 2015-08-24 Pedro Alves <palves@redhat.com> * inferiors.c (get_first_process): New function. * inferiors.h (get_first_process): New declaration. * remote-utils.c (read_ptid): Default to the first process in the list, instead of to the current thread's process. gdb/testsuite/ChangeLog: 2015-08-24 Pedro Alves <palves@redhat.com> * gdb.server/connect-without-multi-process.c: New file. * gdb.server/connect-without-multi-process.exp: New file.
62 lines
1.8 KiB
Plaintext
62 lines
1.8 KiB
Plaintext
# Copyright 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/>. */
|
|
|
|
# Check that we can connect to GDBserver with the multiprocess
|
|
# extensions disabled, and run to main.
|
|
|
|
load_lib gdbserver-support.exp
|
|
|
|
if {[skip_gdbserver_tests]} {
|
|
return
|
|
}
|
|
|
|
standard_testfile
|
|
|
|
if {[build_executable "failed to prepare" $testfile $srcfile debug]} {
|
|
return -1
|
|
}
|
|
|
|
# Test spawning gdbserver with a program, connect to it and run to
|
|
# main, with both multiprocess extensions on and off.
|
|
proc do_test {multiprocess} {
|
|
global binfile
|
|
|
|
clean_restart $binfile
|
|
|
|
# Make sure we're disconnected, in case we're testing with an
|
|
# extended-remote board, therefore already connected.
|
|
gdb_test "disconnect" ".*"
|
|
|
|
gdb_test_no_output "set remote multiprocess-feature $multiprocess"
|
|
|
|
set res [gdbserver_spawn ${binfile}]
|
|
set gdbserver_protocol [lindex $res 0]
|
|
set gdbserver_gdbport [lindex $res 1]
|
|
|
|
gdb_test "break main" "Breakpoint .*"
|
|
|
|
gdb_test "target $gdbserver_protocol $gdbserver_gdbport" \
|
|
"Remote debugging using .*" \
|
|
"target $gdbserver_protocol"
|
|
|
|
gdb_test "continue" "main .*" "continue to main"
|
|
}
|
|
|
|
foreach multiprocess { "off" "auto" } {
|
|
with_test_prefix "multiprocess=$multiprocess" {
|
|
do_test $multiprocess
|
|
}
|
|
}
|