diff --git a/gdb/ChangeLog b/gdb/ChangeLog index df5a9dfc73..cd13f70db2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2014-07-14 Pedro Alves + + PR gdb/17072 + * top.c (gdb_readline_wrapper_line): Tweak comment. + (gdb_readline_wrapper_cleanup): If readline is enabled, reinstall + the input handler callback. + 2014-07-14 Pedro Alves PR gdb/17072 diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index c0207c44c3..f6c963df19 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2014-07-14 Pedro Alves + + PR gdb/17072 + * gdb.base/paginate-bg-execution.c: New file. + * gdb.base/paginate-bg-execution.exp: New file. + 2014-07-14 Pedro Alves PR gdb/17072 diff --git a/gdb/testsuite/gdb.base/paginate-bg-execution.c b/gdb/testsuite/gdb.base/paginate-bg-execution.c new file mode 100644 index 0000000000..e741785e72 --- /dev/null +++ b/gdb/testsuite/gdb.base/paginate-bg-execution.c @@ -0,0 +1,32 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 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 . */ + +#include + +static void +after_sleep (void) +{ + return; /* after sleep */ +} + +int +main (void) +{ + sleep (3); + after_sleep (); + return 0; +} diff --git a/gdb/testsuite/gdb.base/paginate-bg-execution.exp b/gdb/testsuite/gdb.base/paginate-bg-execution.exp new file mode 100644 index 0000000000..dcff8ad29e --- /dev/null +++ b/gdb/testsuite/gdb.base/paginate-bg-execution.exp @@ -0,0 +1,127 @@ +# 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 . + +# A collection of tests related to running execution commands directly +# from the command line, with "-ex". + +standard_testfile + +if {[build_executable "failed to prepare" $testfile $srcfile debug] == -1} { + return -1 +} + +# Check that we handle pagination correctly when it triggers due to an +# background execution command entered directly on the command line. + +proc test_bg_execution_pagination_return {} { + global binfile + global pagination_prompt + + with_test_prefix "paginate" { + clean_restart $binfile + + if ![runto_main] then { + fail "Can't run to main" + return 0 + } + + gdb_test "b after_sleep" + + gdb_test_no_output "set height 2" + + gdb_test "continue&" "Continuing\." + + set test "pagination handled, breakpoint hit" + set saw_pagination_prompt 0 + gdb_test_multiple "" $test { + -re "$pagination_prompt$" { + set saw_pagination_prompt 1 + send_gdb "\n" + exp_continue + } + -notransfer -re "" { + # Otherwise gdb_test_multiple considers this an + # error. + exp_continue + } + -re "after sleep\[^\r\n\]+\r\n$" { + gdb_assert $saw_pagination_prompt $test + } + } + + # GDB used to crash here. + 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 a background execution command entered directly on the +# command line. + +proc test_bg_execution_pagination_cancel { how } { + global binfile + global gdb_prompt pagination_prompt + + with_test_prefix "cancel with $how" { + clean_restart $binfile + + if ![runto_main] then { + fail "Can't run to main" + return 0 + } + + gdb_test "b after_sleep" + + gdb_test_no_output "set height 2" + + gdb_test "continue&" "Continuing\." + + set test "continue& paginates" + gdb_test_multiple "" $test { + -re "$pagination_prompt$" { + pass $test + } + -notransfer -re "" { + # 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" + } +} + +test_bg_execution_pagination_return +test_bg_execution_pagination_cancel "ctrl-c" +test_bg_execution_pagination_cancel "quit" diff --git a/gdb/top.c b/gdb/top.c index 722eb55ae1..93a4a1694c 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -756,7 +756,8 @@ gdb_readline_wrapper_line (char *line) after_char_processing_hook = NULL; /* Prevent parts of the prompt from being redisplayed if annotations - are enabled, and readline's state getting out of sync. */ + are enabled, and readline's state getting out of sync. We'll + restore it in gdb_readline_wrapper_cleanup. */ if (async_command_editing_p) rl_callback_handler_remove (); } @@ -776,6 +777,12 @@ gdb_readline_wrapper_cleanup (void *arg) gdb_assert (input_handler == gdb_readline_wrapper_line); input_handler = cleanup->handler_orig; + + /* Reinstall INPUT_HANDLER in readline, without displaying a + prompt. */ + if (async_command_editing_p) + rl_callback_handler_install (NULL, input_handler); + gdb_readline_wrapper_result = NULL; gdb_readline_wrapper_done = 0;