From patchwork Wed Sep 30 11:07:35 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pedro Alves X-Patchwork-Id: 8886 Received: (qmail 124725 invoked by alias); 30 Sep 2015 11:07:40 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 124666 invoked by uid 89); 30 Sep 2015 11:07:39 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.9 required=5.0 tests=AWL, BAYES_20, SPF_HELO_PASS, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Wed, 30 Sep 2015 11:07:38 +0000 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 8D015341AC4 for ; Wed, 30 Sep 2015 11:07:37 +0000 (UTC) Received: from brno.lan (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t8UB7aG8024965 for ; Wed, 30 Sep 2015 07:07:36 -0400 From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH] Fix gdb.base/a2-run.exp race Date: Wed, 30 Sep 2015 12:07:35 +0100 Message-Id: <1443611255-21068-1-git-send-email-palves@redhat.com> This patch fixes this racy failure, with the native-extended-gdbserver board: (gdb) run Starting program: build/gdb/testsuite/outputs/gdb.base/a2-run/a2-run Remote debugging from host 127.0.0.1 Process build/gdb/testsuite/outputs/gdb.base/a2-run/a2-run created; pid = 23832 Reading /lib64/ld-linux-x86-64.so.2 from remote target... warning: File transfers from remote targets can be slow. Use "set sysroot" to access files locally instead. Reading /lib64/ld-linux-x86-64.so.2 from remote target... Reading /lib64/libm.so.6 from remote target... Reading /lib64/libc.so.6 from remote target... [Inferior 1 (process 23832) exited with code 01] (gdb) FAIL: gdb.base/a2-run.exp: run "a2-run" with no args PASS: gdb.base/a2-run.exp: no spurious messages at program exit run 5 Starting program: build/gdb/testsuite/outputs/gdb.base/a2-run/a2-run 5 Reading /lib64/ld-linux-x86-64.so.2 from remote target... usage: factorial Child exited with status 1 Note that the output is correct; it's just that inferior output appeared after gdb's output, and the test doesn't handle that correctly. This comment isn't really correct, unfortunately: # waiting. If we had already seen the status wrapper exit, # gdb_test_multiple/expect has no spawn ids left, and thus # returns. That's true of expect in general, but I had missed / forgot that gdb_test_multiple internally has extra matches using "-i $gdb_spawn_id", so even if the caller clears all the indirect spawn id lists, gdb_test_multiple will continue waiting. So do a conditional exp_continue manually instead. gdb/testsuite/ChangeLog: 2015-09-30 Pedro Alves * gdb.base/a2-run.exp (maybe_exp_continue): New procedure. (top level): Use it in run with no args test. --- gdb/testsuite/gdb.base/a2-run.exp | 54 +++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/gdb/testsuite/gdb.base/a2-run.exp b/gdb/testsuite/gdb.base/a2-run.exp index 4a3fcb4..c1a75ee 100644 --- a/gdb/testsuite/gdb.base/a2-run.exp +++ b/gdb/testsuite/gdb.base/a2-run.exp @@ -39,57 +39,73 @@ set saw_spurious_output 0 set test "run \"$testfile\" with no args" +# Indirect spawn id lists. Used to be able to disable the inferior +# and gdb's spawn_ids and regexes as soon as we see the expected +# output. set inferior_spawn_list "$inferior_spawn_id" set gdb_spawn_list "$gdb_spawn_id" +# Clear either the gdb or the inferior spawn_id list and iff +# afterwards we still have any spawn id in the indirect lists, +# continue expecting. +proc maybe_exp_continue {which} { + global inferior_spawn_list gdb_spawn_list + + if {$which == "gdb"} { + set gdb_spawn_list "" + } elseif {$which == "inferior"} { + set inferior_spawn_list "" + } else { + error "invalid parameter" + } + + if {$inferior_spawn_list != "" || $gdb_spawn_list != ""} { + exp_continue + } +} + +# Note that if $inferior_spawn_id != $gdb_spawn_id the order we pick +# output from each spawn id is undefined. set res [gdb_test_multiple "" $test { -i inferior_spawn_list -re "usage: factorial " { set saw_usage 1 - exp_continue + maybe_exp_continue inferior } -re "EXIT code 1" { set saw_exit_wrapper 1 - set inferior_spawn_list "" - exp_continue + maybe_exp_continue inferior } eof { if {$inferior_spawn_id != $gdb_spawn_id} { # In this case we may see the server/inferior exit before # GDB's program exit output. Remove from spawn list and # continue waiting. - set inferior_spawn_list "" - exp_continue + maybe_exp_continue inferior + } else { + # GDB crash. + fail "$test (eof)" } - # GDB crash. - fail "$test (eof)" } -i gdb_spawn_list -re "$inferior_exited_re with code 01.\r\n$gdb_prompt $" { + maybe_exp_continue gdb } -re "$inferior_exited_re with code 01.*$gdb_prompt $" { set saw_spurious_output 1 + maybe_exp_continue gdb } -re "$inferior_exited_re normally.\r\n$gdb_prompt $" { # This is only considered a pass if we see the exit wrapper - # status. Since if $inferior_spawn_id != $gdb_spawn_id the - # order we pick output from each spawn id isn't defined, - # remove gdb_spawn_id from the match lists and go back to - # waiting. If we had already seen the status wrapper exit, - # gdb_test_multiple/expect has no spawn ids left, and thus - # returns. - set gdb_spawn_list "" - exp_continue + # status. + maybe_exp_continue gdb } -re "$inferior_exited_re normally.*$gdb_prompt $" { set saw_spurious_output 1 - - # See above. - set gdb_spawn_list "" - exp_continue + maybe_exp_continue gdb } }]