From a0922d80dff15d4fbd5d469f56bcd1696846b90a Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Thu, 16 Nov 2017 18:44:44 +0000 Subject: [PATCH] Test breakpoint commands w/ "continue" + Ctrl-C This adds the testcase that exposed the multiple problems with Ctrl-C handling fixed by the previous patches, when run against both native and gdbserver GNU/Linux. gdb/ChangeLog: 2017-11-16 Pedro Alves * gdb.base/bp-cmds-continue-ctrl-c.c: New file. * gdb.base/bp-cmds-continue-ctrl-c.exp: New file. --- gdb/testsuite/ChangeLog | 5 + .../gdb.base/bp-cmds-continue-ctrl-c.c | 35 +++++ .../gdb.base/bp-cmds-continue-ctrl-c.exp | 136 ++++++++++++++++++ 3 files changed, 176 insertions(+) create mode 100644 gdb/testsuite/gdb.base/bp-cmds-continue-ctrl-c.c create mode 100644 gdb/testsuite/gdb.base/bp-cmds-continue-ctrl-c.exp diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index bfee9ec016..c70c65083c 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-11-16 Pedro Alves + + * gdb.base/bp-cmds-continue-ctrl-c.c: New file. + * gdb.base/bp-cmds-continue-ctrl-c.exp: New file. + 2017-11-16 Pedro Alves * gdb.rust/modules.exp: Skip tests that rely on inferior I/O if diff --git a/gdb/testsuite/gdb.base/bp-cmds-continue-ctrl-c.c b/gdb/testsuite/gdb.base/bp-cmds-continue-ctrl-c.c new file mode 100644 index 0000000000..2ec0b541d8 --- /dev/null +++ b/gdb/testsuite/gdb.base/bp-cmds-continue-ctrl-c.c @@ -0,0 +1,35 @@ +/* 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 . */ + +#include + +static void +foo (void) +{ + usleep (100); +} + +int +main () +{ + alarm (60); + + while (1) + foo (); + + return 0; +} diff --git a/gdb/testsuite/gdb.base/bp-cmds-continue-ctrl-c.exp b/gdb/testsuite/gdb.base/bp-cmds-continue-ctrl-c.exp new file mode 100644 index 0000000000..e1524599cb --- /dev/null +++ b/gdb/testsuite/gdb.base/bp-cmds-continue-ctrl-c.exp @@ -0,0 +1,136 @@ +# 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 . + +# Set a breakpoint with a "continue" command attached, let the +# inferior hit the breakpoint continuously. Check that we can use ^C +# to interrupt the command, and that if ^C is pressed while GDB has +# the terminal (between the stop and the re-resume), the resulting +# "Quit" doesn't mess up the debug session. + +if [target_info exists gdb,nosignals] { + verbose "Skipping because of nosignals." + continue +} + +# This test requires sending ^C to interrupt the running target. +if [target_info exists gdb,nointerrupts] { + verbose "Skipping because of nointerrupts." + return +} + +standard_testfile + +if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} { + return -1 +} + +# See intro. + +proc do_test {} { + global srcfile binfile + global gdb_prompt + + gdb_test "break foo" "Breakpoint .*" "set breakpoint" + + gdb_test \ + [multi_line_input \ + {commands} \ + { c} \ + {end}] \ + "" "commands" + + set test "stop with control-c" + + for {set iter 0} {$iter < 20} {incr iter} { + + # Useful for debugging. + #send_user "iter: $iter\n" + + # Consume one breakpoint hit (at least), to make sure that the + # continue actually continues between attempts, as opposed to + # "c" not actually resuming and then Ctrl-C managing to + # interrupt anyway. + if {[gdb_test_multiple "continue" "$test (continue)" { + -re "Continuing.*Breakpoint \[^\r\n\]*\r\n" { + } + }] != 0} { + return + } + + set internal_pass "IPASS: $test (iter $iter)" + + # Breakpoint commands run after the target is considered + # stopped, and thus run with GDB owning the terminal. That + # means that it is expected that a Ctrl-C that arrives between + # - GDB reporting the breakpoint hit, and, + # - the breakpoint command continuing the target + # results in a Quit. + + after 200 {send_gdb "\003"} + if {[gdb_test_multiple "" "$test (unexpected)" { + -re "Program terminated with signal SIGALRM.*\r\n$gdb_prompt $" { + fail "$test (SIGALRM)" + return + } + -re "Program received signal SIGINT.*\r\n$gdb_prompt $" { + send_log "$internal_pass (SIGINT)\n" + } + -re "Quit\r\n$gdb_prompt $" { + send_log "$internal_pass (Quit)\n" + } + -re "Quit\r\n\r\nCommand aborted.\r\n$gdb_prompt $" { + send_log "$internal_pass (Command aborted)\n" + } + -re "Breakpoint \[^\r\n\]*$srcfile" { + exp_continue + } + }] != 0} { + break + } + } + + gdb_assert {$iter == 20} "stop with control-c" +} + +# With native debugging and "run" (with job control), if the inferior +# is running, the Ctrl-C reaches the inferior directly, not GDB. With +# native debugging and "attach", or with remote debugging, the Ctrl-C +# reaches GDB first. So for completeness, try both "run" and +# "attach". + +with_test_prefix "run" { + clean_restart $binfile + + if {![runto_main]} { + return -1 + } + + do_test +} + +with_test_prefix "attach" { + if {[can_spawn_for_attach]} { + clean_restart $binfile + + set test_spawn_id [spawn_wait_for_attach $binfile] + set testpid [spawn_id_get_pid $test_spawn_id] + + gdb_test "attach $testpid" "Attaching to.*process $testpid.*" "attach" + + do_test + + kill_wait_spawned_process $test_spawn_id + } +} -- 2.34.1