GDBserver: Fix ignored Ctrl-C after reconnection

This fixes the issue reported by Dmitry Antipov <dantipov@nvidia.com>
here:
  https://sourceware.org/ml/gdb/2017-10/msg00048.html

The problem is that GDBserver stops listening to Ctrl-C/interrupt
requests if you disconnect and reconnect back.

Dmitry wrote:

~~~
Currently gdbserver installs SIGIO handler just once, in
initialize_async_io() called from captured_main(), and this handler is
removed when remote_desc is closed in remote_close().  Next, when a
new instance of remote_desc is fetched from accept() and has '\003'
arrived, input_interrupt() is never called because it is not
registered as SIGIO handler.
~~~

The fix here is not remove the SIGIO handler in the first place, thus
going back to the original before-first-connection state.

(I haven't gone back to try it, but I think this was a regression
caused by commit 8b20733984 ("[GDBserver] Block and unblock SIGIO"),
which was what made remote_close remove the signal handler.)

New test included.

gdb/gdbserver/ChangeLog:
2017-11-16  Pedro Alves  <palves@redhat.com>

	* remote-utils.c (remote_close): Block SIGIO signals instead of
	uninstalling the SIGIO handler.

gdb/testsuite/ChangeLog:
2017-11-16  Pedro Alves  <palves@redhat.com>

	* gdb.server/reconnect-ctrl-c.c: New file.
	* gdb.server/reconnect-ctrl-c.exp: New file.
This commit is contained in:
Pedro Alves 2017-11-16 14:58:51 +00:00
parent 80a0437873
commit e849ea896b
5 changed files with 111 additions and 4 deletions

View File

@ -1,3 +1,8 @@
2017-11-16 Pedro Alves <palves@redhat.com>
* remote-utils.c (remote_close): Block SIGIO signals instead of
uninstalling the SIGIO handler.
2017-11-16 Alan Hayward <alan.hayward@arm.com>
* tdesc.c (tdesc_get_features_xml): Allow null osabi.

View File

@ -378,10 +378,7 @@ remote_close (void)
{
delete_file_handler (remote_desc);
#ifndef USE_WIN32API
/* Remove SIGIO handler. */
signal (SIGIO, SIG_IGN);
#endif
disable_async_io ();
#ifdef USE_WIN32API
closesocket (remote_desc);

View File

@ -1,3 +1,8 @@
2017-11-16 Pedro Alves <palves@redhat.com>
* gdb.server/reconnect-ctrl-c.c: New file.
* gdb.server/reconnect-ctrl-c.exp: New file.
2017-11-16 Phil Muldoon <pmuldoon@redhat.com>
* gdb.python/py-rbreak.exp: New file.

View File

@ -0,0 +1,28 @@
/* This testcase is part of GDB, the GNU debugger.
Copyright 2017 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/>. */
#include <unistd.h>
int
main ()
{
int secs = 30;
while (secs--)
sleep (1);
return 0;
}

View File

@ -0,0 +1,72 @@
# This testcase is part of GDB, the GNU debugger.
#
# Copyright 2017 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/>.
# Test that Ctrl-C works after reconnecting.
load_lib gdbserver-support.exp
if { [skip_gdbserver_tests] } {
verbose "skipping gdbserver tests"
return -1
}
standard_testfile
if [prepare_for_testing "failed to prepare" $testfile $srcfile] {
return -1
}
# Make sure we're disconnected, in case we're testing with an
# extended-remote board, therefore already connected.
with_test_prefix "preparation" {
gdb_test "disconnect" ".*"
}
# Connect, continue, send Ctrl-C and expect a SIGINT stop.
proc connect_continue_ctrl_c {} {
global gdbserver_protocol gdbserver_gdbport
set res [gdb_target_cmd $gdbserver_protocol $gdbserver_gdbport]
if ![gdb_assert {$res == 0} "connect"] {
return
}
set test "continue for ctrl-c"
gdb_test_multiple "continue" $test {
-re "Continuing" {
pass $test
}
}
after 1000 {send_gdb "\003"}
gdb_test "" "Program received signal SIGINT.*" "stop with control-c"
}
with_test_prefix "first" {
# Start GDBserver.
set gdbserver_reconnect_p 1
set res [gdbserver_start "" $binfile]
set gdbserver_protocol [lindex $res 0]
set gdbserver_gdbport [lindex $res 1]
connect_continue_ctrl_c
}
with_test_prefix "second" {
gdb_test "disconnect" "Ending remote debugging."
connect_continue_ctrl_c
}