forked from Imagelibrary/binutils-gdb
On Linux, threads are treated much like separate processes by the kernel. In particular, it's possible to ptrace just a single thread. If gdb tries to attach to a multi-threaded inferior, where a non-main thread is already being traced (e.g., by strace), then gdb will get into an infinite loop attempting to attach. This patch fixes this problem by having the attach fail if ptrace fails to attach to any thread of the inferior.
55 lines
1.9 KiB
Plaintext
55 lines
1.9 KiB
Plaintext
# Copyright 2023 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/>. */
|
|
|
|
# This test only works on GNU/Linux.
|
|
require !use_gdb_stub isnative
|
|
require {!is_remote host}
|
|
require {istarget *-linux*}
|
|
|
|
standard_testfile
|
|
|
|
if {[prepare_for_testing "failed to prepare" $testfile $srcfile \
|
|
{debug pthreads}]} {
|
|
return -1
|
|
}
|
|
|
|
if {![runto "parent_stop"]} {
|
|
return -1
|
|
}
|
|
|
|
# We don't want to be bothered.
|
|
gdb_test_no_output "set confirm off"
|
|
|
|
set child_pid [get_integer_valueof child_thread_pid -1 "get child pid"]
|
|
|
|
# We should not be able to attach to the child at all, because one
|
|
# thread is being traced. The bug here was that gdb would get into an
|
|
# infinite loop trying to attach to this thread.
|
|
gdb_test "add-inferior" "Added inferior 2.*" "add empty inferior 2"
|
|
gdb_test "inferior 2" "Switching to inferior 2.*" "switch to inferior 2"
|
|
# Recognize failures from either gdb or gdbserver.
|
|
gdb_test "attach $child_pid" \
|
|
"(Cannot attach to|Attaching to process $decimal failed).*" \
|
|
"should not attach to child process"
|
|
|
|
|
|
# Now kill the parent process, ending the trace.
|
|
gdb_test "inferior 1" "Switching to inferior 1.*" "switch to inferior 1"
|
|
gdb_test "kill" ".*" "kill the parent process"
|
|
|
|
# Kill the child process as well. Use the shell to avoid funny
|
|
# business with gdbserver testing.
|
|
remote_exec target "kill -9 $child_pid"
|