[PATCH] Allow 'interrupt -a' in all-stop mode

Pedro Alves pedro@palves.net
Mon Jun 13 14:10:07 GMT 2022


On 2022-06-10 16:52, Tom Tromey wrote:

> +
> +   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 ()
> +{
> +  while (1)
> +    sleep (50);

We try to avoid having testcases that run forever if GDB misbehaves.  For more complicated
threading tests, we end up with something like:

  /* Don't run forever.  */
  alarm (300);

For simpler testcases, we can just do something like:

  int i;

  for (i = 0; i < 60; i++)
    sleep (1);

('i' should not be declared within the 'for' so that this compiles with
compilers that default to C89/C90.)

... which avoids introducing the depending on "alarm", which does not exist on all targets.


> +}
> diff --git a/gdb/testsuite/gdb.base/interrupt-a.exp b/gdb/testsuite/gdb.base/interrupt-a.exp
> new file mode 100644
> index 00000000000..9c65d6edd5f
> --- /dev/null
> +++ b/gdb/testsuite/gdb.base/interrupt-a.exp
> @@ -0,0 +1,50 @@
> +# Copyright (C) 2022 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 'interrupt -a' works in all stop mode.
> +
> +standard_testfile .c
> +set executable ${testfile}
> +
> +if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug}]} {
> +    return -1
> +}
> +
> +if {![runto_main]} {
> +    return -1
> +}
> +
> +set test "continue &"
> +gdb_test_multiple "continue&" $test {
> +    -re "Continuing\\.\r\n$gdb_prompt " {
> +	pass $test
> +    }
> +}

You can get rid of the test variable (throughout) by using $gdb_test_name, like:

 gdb_test_multiple "continue &" "" {
     -re "Continuing\\.\r\n$gdb_prompt " {
 	pass $gdb_test_name
     }
 }

> +
> +set test "interrupt -a"
> +gdb_test_multiple $test $test {
> +    -re "$gdb_prompt " {
> +	pass $test
> +    }
> +}
> +
> +after 200

This sleep normally appears after the "continue &" command, to give a bit of
time for the program to run after GDB prints "Continuing".  Here, after an "interrupt"
command it doesn't appear necessary.  I think you want to move it to right after
the continue command.

> +
> +set test "inferior stopped"
> +gdb_test_multiple "" $test {
> +    -re "Program received signal" {
> +	pass $test
> +    }
> +}
> 

Otherwise LGTM.  Thanks.


More information about the Gdb-patches mailing list