Message ID | gerrit.1571405222000.Ib6fe193d23ba08d7fbb369f41debf2cee5816f6b@gnutoolchain-gerrit.osci.io |
---|---|
State | New |
Headers | show |
Tankut Baris Aktemur has posted comments on this change. Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/134 ...................................................................... Patch Set 1: (3 comments) > Have the tests been validated as reliable, that is, without false positives? In the tests I ran, the infinite-looping problem was detected reliably. However, I don't think the test guarantees this. Is there a way to make this guarantee? https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/134/1/gdb/testsuite/gdb.multi/multi-exit.exp File gdb/testsuite/gdb.multi/multi-exit.exp: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/134/1/gdb/testsuite/gdb.multi/multi-exit.exp@46 PS1, Line 46: 41 | } 42 | 43 | # We want both processes in a running state. 44 | gdb_test_no_output "set schedule-multiple on" 45 | 46 > gdb_continue_to_end > Add a comment stating we want to see GDB complete the command and return the prompt instead of being […] Done https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/134/1/gdb/testsuite/gdb.multi/multi-kill.c File gdb/testsuite/gdb.multi/multi-kill.c: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/134/1/gdb/testsuite/gdb.multi/multi-kill.c@26 PS1, Line 26: 21 | #include <unistd.h> 22 | 23 | int 24 | main () 25 | { 26 > /* Don't run forever in case GSB crashes and DejaGNU fails to kill 27 | this program. */ 28 | alarm (10); 29 | 30 | while (1) 31 | ; > Typo, GSB -> GDB Done https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/134/1/gdb/testsuite/gdb.multi/multi-kill.exp File gdb/testsuite/gdb.multi/multi-kill.exp: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/134/1/gdb/testsuite/gdb.multi/multi-kill.exp@18 PS1, Line 18: 13 | # GNU General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU General Public License 16 | # along with this program. If not, see <http://www.gnu.org/licenses/>. 17 | 18 > # Test receiving exit events from multiple inferiors. 19 | 20 | standard_testfile 21 | 22 | if {![can_spawn_for_attach]} { 23 | return 0 > The descriptions for both tests are the same. […] In this test, the received waitkind status is TARGET_WAITKIND_SIGNALLED. In the other, it's TARGET_WAITKIND_EXITED. I'll update the comments accordingly and with more high-level description.
Pedro Alves has posted comments on this change. Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/134 ...................................................................... Patch Set 2: (6 comments) | --- /dev/null | +++ /COMMIT_MSG | @@ -1,0 +7,31 @@ CommitDate: 2019-11-04 11:21:38 +0100 | +testsuite: add test for handling multiple inferiors exiting | + | +In all-stop mode, upon receiving a stop event, GDB attempts to stop | +other threads. It is possible that a thread GDB wants to stop has | +already terminated before GDB sees that exit event. So, the response | +to GDB's stop request may be a status kind *other* than | +TARGET_WAITKIND_STOPPED (e.g. TARGET_WAITKIND_EXITED). Such a case | +should be handled by GDB gracefully and the user should be given back | +the debugger prompt. | + | +The new tests added with this patch cover the TARGET_WAITKIND_EXITED | +and TARGET_WAITKIND_SIGNALLED cases. The existing tests | + | + gdb.threads/leader-exit.exp | + gdb.threads/non-ldr-exc-2.exp | + | +exercise the TARGET_WAITKIND_NO_RESUMED response, whereas the existing | +test | + | + gdb.threads/tid-reuse.exp | + | +exercises the TARGET_WAITKIND_THREAD_EXITED case. PS2, Line 28: I'm curious about these references to the other waitkind cases. I'm not sure I understand correctly what they mean though, because those tests already pass today without the fix you proposed? The fix included a change to the TARGET_WAITKIND_THREAD_EXITED case, for example. | + | +gdb/testsuite/ChangeLog: | +2019-11-04 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> | + | + * gdb.multi/multi-exit.c: New file. | + * gdb.multi/multi-exit.exp: New file. | + * gdb.multi/multi-kill.c: New file. | + * gdb.multi/multi-kill.exp: New file. | + | --- /dev/null | +++ gdb/testsuite/gdb.multi/multi-exit.exp | @@ -1,0 +25,20 @@ # TARGET_WAITKIND_STOPPED should be handled by GDB without problems. | +standard_testfile | + | +if {![can_spawn_for_attach]} { | + return 0 | +} | + | +if {[prepare_for_testing "failed to prepare" $testfile $srcfile]} { | + return -1 | +} | + | +gdb_test "add-inferior -exec $binfile" PS2, Line 35: Please add an explicit test name, so that the local path in $binfile doesn't show up in gdb.sum. | + | +proc test {} { | + # Start the processes separately. | + gdb_test_no_output "set schedule-multiple off" | + | + gdb_test "inferior 1" ".*Switching to inferior 1.*" | + if {![runto_main]} { | + fail "starting inferior 1" | + return -1 | --- /dev/null | +++ gdb/testsuite/gdb.multi/multi-kill.exp | @@ -1,0 +26,64 @@ standard_testfile | + | +if {![can_spawn_for_attach]} { | + return 0 | +} | + | +if {[prepare_for_testing "failed to prepare" $testfile $srcfile]} { | + return -1 | +} | + | +gdb_test "add-inferior -exec $binfile" "Added inferior 2.*" PS2, Line 35: Same comment about paths in gdb.sum. | + | +# We want both processes in a running state. | +gdb_test_no_output "set schedule-multiple on" | + | +proc test {} { | + # Start the programs, attach to them, then kill both from outside. | + global binfile | + global gdb_prompt | + | + set spawn_id_list [spawn_wait_for_attach [list $binfile $binfile]] | + set test_spawn_id1 [lindex $spawn_id_list 0] | + set test_spawn_id2 [lindex $spawn_id_list 1] | + set testpid1 [spawn_id_get_pid $test_spawn_id1] | + set testpid2 [spawn_id_get_pid $test_spawn_id2] | + | + gdb_test "inferior 1" ".*Switching to inferior 1.*" | + | + gdb_test "attach $testpid1" \ | + "Attaching to program: .*, process $testpid1.*(in|at).*" \ | + "attach to program 1" PS2, Line 55: When testing with --target_board=native-extended-remote, I get: attach 22448 A program is being debugged already. Kill it? (y or n) n Not killed. (gdb) FAIL: gdb.multi/multi-kill.exp: iteration 2: attach to program 1 (got interactive prompt) | + | + gdb_test "inferior 2" ".*Switching to inferior 2.*" | + | + gdb_test "attach $testpid2" \ | + "Attaching to program: .*, process $testpid2.*(in|at).*" \ | + "attach to program 2" | + | + send_gdb "continue\n" | + gdb_expect { PS2, Line 64: Please use gdb_test_multiple instead of gdb_expect. Instead of "default" use the proc's return value. | + -re "Continuing." { | + # nothing; keep going. | + } | + default { | + untested "could not continue" | + return -1 | + } | + } | + | + # Kill both processes at once. | + remote_exec build "kill -9 ${testpid1} ${testpid2}" | + | + # GDB should give the prompt back instead of going into an | + # infinite loop. | + set testname "back to gdb prompt" | + gdb_expect { PS2, Line 80: Ditto. | + -re "Program terminated with signal.*$gdb_prompt" { | + pass $testname | + } | + default { | + fail $testname | + } | + } | + | + # Make sure that the processes are gone.
Tankut Baris Aktemur has posted comments on this change.
Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/134
......................................................................
Patch Set 2:
(1 comment)
| --- /dev/null
| +++ gdb/testsuite/gdb.multi/multi-kill.exp
| @@ -1,0 +55,19 @@ proc test {} {
| + "attach to program 1"
| +
| + gdb_test "inferior 2" ".*Switching to inferior 2.*"
| +
| + gdb_test "attach $testpid2" \
| + "Attaching to program: .*, process $testpid2.*(in|at).*" \
| + "attach to program 2"
| +
| + send_gdb "continue\n"
| + gdb_expect {
PS2, Line 64:
> Instead of "default" use the proc's return value.
Sorry, I didn't understand. Could you clarify?
(And my apologies for taking a long time to get back to this patch.)
| + -re "Continuing." {
| + # nothing; keep going.
| + }
| + default {
| + untested "could not continue"
| + return -1
| + }
| + }
| +
Tankut Baris Aktemur has abandoned this change. ( https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/134 ) Change subject: testsuite: add test for handling multiple inferiors exiting ...................................................................... Abandoned Migrated to https://sourceware.org/ml/gdb-patches/2020-02/msg00153.html
diff --git a/gdb/testsuite/gdb.multi/multi-exit.c b/gdb/testsuite/gdb.multi/multi-exit.c new file mode 100644 index 0000000..d94b807 --- /dev/null +++ b/gdb/testsuite/gdb.multi/multi-exit.c @@ -0,0 +1,22 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2019 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/>. */ + +int +main () +{ + return 0; +} diff --git a/gdb/testsuite/gdb.multi/multi-exit.exp b/gdb/testsuite/gdb.multi/multi-exit.exp new file mode 100644 index 0000000..6281e51 --- /dev/null +++ b/gdb/testsuite/gdb.multi/multi-exit.exp @@ -0,0 +1,46 @@ +# This testcase is part of GDB, the GNU debugger. + +# Copyright 2019 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 receiving exit events from multiple inferiors. + +standard_testfile + +if {![can_spawn_for_attach]} { + return 0 +} + +if {[prepare_for_testing "failed to prepare" $testfile $srcfile]} { + return -1 +} + +if {![runto_main]} { + fail "starting inferior 1" + return -1 +} + +gdb_test "add-inferior -exec $binfile" +gdb_test "inferior 2" ".*Switching to inferior 2.*" + +if {![runto_main]} { + fail "starting inferior 2" + return -1 +} + +# We want both processes in a running state. +gdb_test_no_output "set schedule-multiple on" + +gdb_continue_to_end diff --git a/gdb/testsuite/gdb.multi/multi-kill.c b/gdb/testsuite/gdb.multi/multi-kill.c new file mode 100644 index 0000000..aa2e2e9 --- /dev/null +++ b/gdb/testsuite/gdb.multi/multi-kill.c @@ -0,0 +1,34 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2019 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/>. */ + +/* This program is intended to be started outside of gdb, and then + attached to by gdb. */ + +#include <unistd.h> + +int +main () +{ + /* Don't run forever in case GSB crashes and DejaGNU fails to kill + this program. */ + alarm (10); + + while (1) + ; + + return 0; +} diff --git a/gdb/testsuite/gdb.multi/multi-kill.exp b/gdb/testsuite/gdb.multi/multi-kill.exp new file mode 100644 index 0000000..40665f8 --- /dev/null +++ b/gdb/testsuite/gdb.multi/multi-kill.exp @@ -0,0 +1,85 @@ +# This testcase is part of GDB, the GNU debugger. + +# Copyright 2019 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 receiving exit events from multiple inferiors. + +standard_testfile + +if {![can_spawn_for_attach]} { + return 0 +} + +if {[prepare_for_testing "failed to prepare" $testfile $srcfile]} { + return -1 +} + +# Start the programs, attach to them, then kill both from outside. +# GDB would pick one of the stop events and process it. In the +# all-stop mode, GDB will try to stop the other inferior, which is +# also dead. GDB should be able to handle this case and give back the +# prompt. + +set spawn_id_list [spawn_wait_for_attach [list $binfile $binfile]] +set test_spawn_id1 [lindex $spawn_id_list 0] +set test_spawn_id2 [lindex $spawn_id_list 1] +set testpid1 [spawn_id_get_pid $test_spawn_id1] +set testpid2 [spawn_id_get_pid $test_spawn_id2] + +gdb_test "attach $testpid1" \ + "Attaching to program: .*, process $testpid1.*(in|at).*" \ + "attach to program 1" + +gdb_test "add-inferior -exec $binfile" "Added inferior 2.*" + +gdb_test "inferior 2" ".*Switching to inferior 2.*" \ + "switch to second inferior" + +gdb_test "attach $testpid2" \ + "Attaching to program: .*, process $testpid2.*(in|at).*" \ + "attach to program 2" + +# We want both processes in a running state. +gdb_test_no_output "set schedule-multiple on" + +send_gdb "continue\n" +gdb_expect { + -re "Continuing." { + # nothing; keep going. + } + default { + untested "could not continue" + return -1 + } +} + +# Kill both processes at once. +remote_exec build "kill -9 ${testpid1} ${testpid2}" + +# We should get back the gdb prompt. +set testname "back to gdb prompt" +gdb_expect { + -re "Program terminated with signal.*$gdb_prompt" { + pass $testname + } + default { + fail $testname + } +} + +# Make sure that the processes are gone. +kill_wait_spawned_process $test_spawn_id1 +kill_wait_spawned_process $test_spawn_id2