diff options
author | Pedro Alves <palves@redhat.com> | 2014-07-14 19:55:31 +0100 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2014-07-14 20:31:04 +0100 |
commit | 94696ad31c3fac4a3bc17391e42362d83be1fb56 (patch) | |
tree | ff0a3d73cfc5f48ed20f13d050daf3eeaf1e44c3 /gdb/testsuite/gdb.base/paginate-execution-startup.exp | |
parent | bd29394088b5685d336a501fadca88b25ed777bc (diff) | |
download | fsf-binutils-gdb-94696ad31c3fac4a3bc17391e42362d83be1fb56.zip fsf-binutils-gdb-94696ad31c3fac4a3bc17391e42362d83be1fb56.tar.gz fsf-binutils-gdb-94696ad31c3fac4a3bc17391e42362d83be1fb56.tar.bz2 |
Canceling pagination caused by execution command from command line aborts readline/gdb
This fixes:
$ ./gdb program -ex "set height 2" -ex "start"
...
Reading symbols from /home/pedro/gdb/tests/threads...done.
---Type <return> to continue, or q <return> to quit---^CQuit << ctrl-c triggers a Quit
*type something*
readline: readline_callback_read_char() called with no handler!
Aborted
$
Usually, if an error propagates all the way to the top level, we'll
re-enable stdin, in case the command that was running was a
synchronous command. That's done in the event loop's actual loop
(event-loop.c:start_event_loop). However, if a foreground execution
command is run before the event loop starts and throws, nothing is
presently reenabling stdin, which leaves sync_execution set.
When we do start the event loop, because sync_execution is still
(mistakenly) set, display_gdb_prompt removes the readline input
callback, even though stdin is registered in the event loop. Any
input from here on results in readline aborting.
Such commands are run through catch_command_errors,
catch_command_errors_const, so add the tweak there.
gdb/
2014-07-14 Pedro Alves <palves@redhat.com>
PR gdb/17072
* main.c: Include event-top.h.
(handle_command_errors): New function.
(catch_command_errors, catch_command_errors_const): Use it.
gdb/testsuite/
2014-07-14 Pedro Alves <palves@redhat.com>
PR gdb/17072
* gdb.base/paginate-execution-startup.c: New file.
* gdb.base/paginate-execution-startup.exp: New file.
* lib/gdb.exp (pagination_prompt): New global.
(default_gdb_spawn): New procedure, factored out from
default_gdb_spawn.
(default_gdb_start): Adjust to call default_gdb_spawn.
(gdb_spawn): New procedure.
Diffstat (limited to 'gdb/testsuite/gdb.base/paginate-execution-startup.exp')
-rw-r--r-- | gdb/testsuite/gdb.base/paginate-execution-startup.exp | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.base/paginate-execution-startup.exp b/gdb/testsuite/gdb.base/paginate-execution-startup.exp new file mode 100644 index 0000000..dc713ec --- /dev/null +++ b/gdb/testsuite/gdb.base/paginate-execution-startup.exp @@ -0,0 +1,189 @@ +# Copyright (C) 2014 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/>. + +# A collection of tests related to pagination resulting from running +# execution commands directly from the command line, with "-ex". + +standard_testfile + +if {[build_executable "failed to prepare" $testfile $srcfile debug] == -1} { + return -1 +} + +set file_arg $binfile +if [is_remote host] { + set file_arg [remote_download host $file_arg] +} + +global GDBFLAGS +set saved_gdbflags $GDBFLAGS + +# Returns true if the board can 'gdb -ex "start"', false otherwise. + +proc probe_can_run_cmdline {} { + global srcfile file_arg + global saved_gdbflags GDBFLAGS + global gdb_prompt + + set GDBFLAGS $saved_gdbflags + append GDBFLAGS " -ex \"set height 0\"" + append GDBFLAGS " -ex \"start\"" + append GDBFLAGS " --args \"$file_arg\"" + + with_test_prefix "probe support" { + set test "run to main" + + gdb_exit + set res [gdb_spawn] + if { $res != 0} { + fail $test + return -1 + } + + set res -1 + gdb_test_multiple "" $test { + -re "main .* at .*$srcfile.*$gdb_prompt $" { + set res 1 + pass $test + } + -re "Don't know how to run.*$gdb_prompt $" { + set res 0 + unsupported $test + } + } + + # In case the board file wants to send further commands. + gdb_test_no_output "set height unlimited" + return $res + } +} + +# Check that we handle pagination correctly when it triggers due to an +# execution command entered directly on the command line. + +proc test_fg_execution_pagination_return {} { + global file_arg + global saved_gdbflags GDBFLAGS + global gdb_prompt pagination_prompt + + set GDBFLAGS $saved_gdbflags + append GDBFLAGS " -ex \"set height 2\"" + append GDBFLAGS " -ex \"start\"" + append GDBFLAGS " --args \"$file_arg\"" + + with_test_prefix "return" { + set test "run to pagination" + + gdb_exit + set res [gdb_spawn] + if { $res != 0} { + fail $test + return $res + } + gdb_test_multiple "" $test { + -re "$pagination_prompt$" { + pass $test + } + -re "$gdb_prompt $" { + fail $test + } + } + + send_gdb "\n" + + set saw_pagination_prompt 0 + set test "send \\n to GDB" + gdb_test_multiple "" $test { + -re "$pagination_prompt$" { + set saw_pagination_prompt 1 + send_gdb "\n" + exp_continue + } + -notransfer -re "<return>" { + # Otherwise gdb_test_multiple considers this an error. + exp_continue + } + -re "$gdb_prompt $" { + gdb_assert $saw_pagination_prompt $test + } + } + + gdb_test "p 1" " = 1" "GDB accepts further input" + + # In case the board file wants to send further commands. + gdb_test_no_output "set height unlimited" + } +} + +# Check that we handle canceling pagination correctly when it triggers +# due to an execution command entered directly on the command line. + +proc test_fg_execution_pagination_cancel { how } { + global file_arg + global saved_gdbflags GDBFLAGS + global gdb_prompt pagination_prompt + + set GDBFLAGS $saved_gdbflags + + append GDBFLAGS " -ex \"set height 2\"" + append GDBFLAGS " -ex \"start\"" + append GDBFLAGS " --args \"$file_arg\"" + + with_test_prefix "cancel with $how" { + set test "run to pagination" + + gdb_exit + set res [gdb_spawn] + if { $res != 0} { + fail $test + return $res + } + gdb_test_multiple "" $test { + -re "$pagination_prompt$" { + pass $test + } + -notransfer -re "<return>" { + # Otherwise gdb_test_multiple considers this an error. + exp_continue + } + } + + set test "cancel pagination" + if { $how == "ctrl-c" } { + send_gdb "\003" + } else { + send_gdb "q\n" + + } + gdb_test_multiple "" $test { + -re "Quit\r\n$gdb_prompt $" { + pass $test + } + } + + gdb_test "p 1" " = 1" "GDB accepts further input" + + # In case the board file wants to send further commands. + gdb_test_no_output "set height unlimited" + } +} + +if {[probe_can_run_cmdline] > 0} { + test_fg_execution_pagination_return + test_fg_execution_pagination_cancel "ctrl-c" + test_fg_execution_pagination_cancel "quit" +} + +set GDBFLAGS $saved_gdbflags |