diff options
author | Andrew Burgess <andrew.burgess@embecosm.com> | 2019-11-19 18:09:43 +0000 |
---|---|---|
committer | Andrew Burgess <andrew.burgess@embecosm.com> | 2020-01-24 00:11:52 +0000 |
commit | f3364a6d0fefe44fc26a1d5025b3af55ecec5cad (patch) | |
tree | 98a9b7a3b11bec69543e3a6f1a5a8f18ce1cb682 /gdb/testsuite/gdb.server | |
parent | 733d0a679536628eb1be4b4b8aa6384de24ff1f1 (diff) | |
download | gdb-f3364a6d0fefe44fc26a1d5025b3af55ecec5cad.zip gdb-f3364a6d0fefe44fc26a1d5025b3af55ecec5cad.tar.gz gdb-f3364a6d0fefe44fc26a1d5025b3af55ecec5cad.tar.bz2 |
gdb: Re-enable stdin for all UIs from start_event_loop
If we catch an exception in start_event_loop's call to
gdb_do_one_event, then it is possible that the current_ui has changed
since we called async_disable_stdin. If that's the case then calling
async_enable_stdin will be called on the wrong UI.
To solve this problem we wrap the call to async_enable_stdin with
SWITCH_THRU_ALL_UIS, this causes us to try and re-enable stdin for all
UIs, which will catch any for which we called async_disable_stdin.
gdb/ChangeLog:
* event-loop.c (start_event_loop): Wrap async_enable_stdin with
SWITCH_THRU_ALL_UIS.
gdb/testsuite/ChangeLog:
* gdb.server/multi-ui-errors.c: New file.
* gdb.server/multi-ui-errors.exp: New file.
Change-Id: I1e18deff2e6f4e17f7a13adce3553eb001cad93b
Diffstat (limited to 'gdb/testsuite/gdb.server')
-rw-r--r-- | gdb/testsuite/gdb.server/multi-ui-errors.c | 32 | ||||
-rw-r--r-- | gdb/testsuite/gdb.server/multi-ui-errors.exp | 107 |
2 files changed, 139 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.server/multi-ui-errors.c b/gdb/testsuite/gdb.server/multi-ui-errors.c new file mode 100644 index 0000000..1a243b5 --- /dev/null +++ b/gdb/testsuite/gdb.server/multi-ui-errors.c @@ -0,0 +1,32 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2019-2020 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 <stdio.h> +#include <unistd.h> + +int +main (void) +{ + int i; + + printf ("@@XX@@ Inferior Starting @@XX@@\n"); + + for (i = 0; i < 120; ++i) + sleep (1); + + return 0; +} diff --git a/gdb/testsuite/gdb.server/multi-ui-errors.exp b/gdb/testsuite/gdb.server/multi-ui-errors.exp new file mode 100644 index 0000000..c2a05b0 --- /dev/null +++ b/gdb/testsuite/gdb.server/multi-ui-errors.exp @@ -0,0 +1,107 @@ +# This testcase is part of GDB, the GNU debugger. +# +# Copyright 2019-2020 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 what happens if we have multiple UIs in use, and an error +# occurs while running a GDB command. Specifically, do both UIs +# return to an interactive state, or does one (or both) of them get +# stuck in a non-interactive state. + +load_lib gdbserver-support.exp + +standard_testfile + +if {[skip_gdbserver_tests]} { + return 0 +} + +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. +gdb_test "disconnect" ".*" + +# Start gdbserver. +set res [gdbserver_spawn "${binfile}"] +set gdbserver_protocol [lindex $res 0] +set gdbserver_gdbport [lindex $res 1] +set gdbserver_pid [exp_pid -i $server_spawn_id] + +# Save the main UI's spawn ID. +set gdb_main_spawn_id $gdb_spawn_id + +# Create the new PTY for the secondary console UI, issue the 'new-ui' +# command, and wait for a prompt on the second UI. +spawn -pty +set extra_spawn_id $spawn_id +set extra_tty_name $spawn_out(slave,name) +gdb_test_multiple "new-ui console $extra_tty_name" "new-ui" { + -re "New UI allocated\r\n$gdb_prompt $" { + pass $gdb_test_name + } +} +with_spawn_id $extra_spawn_id { + gdb_test_multiple "" "initial prompt on extra console" { + -re "$gdb_prompt $" { + pass $gdb_test_name + } + } +} + +# Connect to the remote and continue its execution from the other UI. +with_spawn_id $extra_spawn_id { + gdb_test "target $gdbserver_protocol $gdbserver_gdbport" ".*" + send_gdb "continue\n" +} + +# We're going to kill the gdbserver, but before we do, lets make sure +# that the inferior has started executing. +with_spawn_id $server_spawn_id { + gdb_test_multiple "" "ensure inferior is running" { + -re "@@XX@@ Inferior Starting @@XX@@" { + pass $gdb_test_name + } + timeout { + fail $gdb_test_name + } + } +} + +# Interact with the main UI. +with_spawn_id $gdb_main_spawn_id { + gdb_test "echo hello\\n" "hello" "interact with GDB's main UI" +} + +# Now kill the gdbserver. +remote_exec target "kill -9 $gdbserver_pid" + +# We expect to land back at a GDB prompt in both UIs, however there is +# currently an issue that in the original UI GDB doesn't reprint its +# prompt. That said, getting a prompt isn't the point of this test. +# The point is that we should be able to interact with GDB from either +# interpreter now. + +with_spawn_id $gdb_main_spawn_id { + gdb_test "echo" "" \ + "main UI, prompt after gdbserver dies" +} + +with_spawn_id $extra_spawn_id { + gdb_test "echo" "" \ + "extra UI, prompt after gdbserver dies" +} |