From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12798 invoked by alias); 28 Apr 2011 14:19:41 -0000 Received: (qmail 12788 invoked by uid 22791); 28 Apr 2011 14:19:38 -0000 X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL,BAYES_00,TW_DF,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 28 Apr 2011 14:19:22 +0000 Received: (qmail 15200 invoked from network); 28 Apr 2011 14:19:21 -0000 Received: from unknown (HELO scottsdale.localnet) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 28 Apr 2011 14:19:21 -0000 From: Pedro Alves To: gdb-patches@sourceware.org Subject: Re: [RFC] Fixing gdb.base/completion.exp (PR testsuite/12649) Date: Thu, 28 Apr 2011 14:19:00 -0000 User-Agent: KMail/1.13.5 (Linux/2.6.35-28-generic; KDE/4.6.2; x86_64; ; ) Cc: Marek Polacek , Joel Brobecker References: <4DB82F26.30801@redhat.com> <201104271623.21862.pedro@codesourcery.com> <4DB85510.90808@redhat.com> In-Reply-To: <4DB85510.90808@redhat.com> MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201104281519.21615.pedro@codesourcery.com> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-04/txt/msg00541.txt.bz2 On Wednesday 27 April 2011 18:40:32, Marek Polacek wrote: > On 04/27/2011 05:23 PM, Pedro Alves wrote: > > What are these problems exactly? > > Duh. Now I'm not sure what I've meant when writing this. But > you cannot, for instance, use the '\t' in gdb_test "blahblah\t", > since this will end up with "ERROR: Undefined command". Are you sure? I did't see that when I try it. > > I also wonder what's the rationale for the sleeps in the > > current implementation? > > Probably some imperfect way to avoid races--so the buffer would > be read at once after that sleep. Yeah. send_gdb "show output\t" sleep 1 gdb_expect { -re "^show output-radix $"\ { send_gdb "\n" gdb_expect { -re "Default output radix for printing of values is 10\\..*$gdb_prompt $"\ { pass "complete 'show output'"} -re ".*$gdb_prompt $" { fail "complete 'show output'"} timeout {fail "(timeout) complete 'show output'"} } } -re "^show output$"\ { send_gdb "\n" gdb_expect { -re "Default output radix for printing of values is 10\\..*$gdb_prompt $"\ { fail "complete 'show output'"} -re ".*$gdb_prompt $" { fail "complete 'show output'"} timeout { fail "(timeout) complete 'show output'"} } } -re ".*$gdb_prompt $" { fail "complete 'show output'" } timeout { fail "(timeout) complete 'show output'" } } The "^show output$" regex will match if expect happens to not see the expanded output-radix in the buffer yet. I don't see a reason for that regex, so I think we should just remove it in this case. And I'd much rather we do this (remote the races) as first step instead of completely rewriting the whole test file into something completely different... The other races are similar in spirit. It's caused by having a single gdb_expect with regexes like: -re "address.*types.*$gdb_prompt info $" {} -re ".*$gdb_prompt $" {} This is racy because the recond regex will also match "address.*types.*$gdb_prompt" if "$gdb_prompt " happens to be in the buffer but "info " isn't yet. Please try the patch below, and let me know what you think. A follow up step would convert/simplify the send_gdb+gdb_expects into gdb_test&friends. -- Pedro Alves 2011-04-28 Pedro Alves Fix races. testsuite/ * gdb.base/completion.exp: Remove all sleep calls. Remove unnecessary regexs. Don't explicitly expect anything after the prompt. Eat the prompt if necessary. --- gdb/testsuite/gdb.base/completion.exp | 139 +++++++++------------------------- 1 file changed, 40 insertions(+), 99 deletions(-) Index: src/gdb/testsuite/gdb.base/completion.exp =================================================================== --- src.orig/gdb/testsuite/gdb.base/completion.exp 2011-04-28 14:02:22.000000000 +0100 +++ src/gdb/testsuite/gdb.base/completion.exp 2011-04-28 14:52:26.595644001 +0100 @@ -96,7 +96,6 @@ set timeout 30 send_gdb "hfgfh\t" -sleep 1 gdb_expect { -re "^hfgfh\\\x07$"\ { send_gdb "\n" @@ -114,7 +113,6 @@ gdb_expect { #exp_internal 0 send_gdb "show output\t" -sleep 1 gdb_expect { -re "^show output-radix $"\ { send_gdb "\n" @@ -125,16 +123,6 @@ gdb_expect { timeout {fail "(timeout) complete 'show output'"} } } - -re "^show output$"\ - { send_gdb "\n" - gdb_expect { - -re "Default output radix for printing of values is 10\\..*$gdb_prompt $"\ - { fail "complete 'show output'"} - -re ".*$gdb_prompt $" { fail "complete 'show output'"} - timeout { fail "(timeout) complete 'show output'"} - } - - } -re ".*$gdb_prompt $" { fail "complete 'show output'" } timeout { fail "(timeout) complete 'show output'" } @@ -142,7 +130,6 @@ gdb_expect { send_gdb "show output-\t" -sleep 1 gdb_expect { -re "^show output-radix $"\ { send_gdb "\n" @@ -153,27 +140,15 @@ gdb_expect { timeout {fail "(timeout) complete 'show output-'"} } } - -re "^show output-$"\ - { send_gdb "\n" - gdb_expect { - -re "Default output radix for printing of values is 10\\..*$gdb_prompt $"\ - { fail "complete 'show output-'"} - -re ".*$gdb_prompt $" { fail "complete 'show output-'"} - timeout { fail "(timeout) complete 'show output-'"} - } - - } -re ".*$gdb_prompt $" { fail "complete 'show output-'" } timeout { fail "(timeout) complete 'show output-'" } } send_gdb "p\t" -sleep 1 gdb_expect { -re "^p\\\x07$"\ { send_gdb "\n" - sleep 1 gdb_expect { -re "The history is empty\\..*$gdb_prompt $"\ { pass "complete 'p'"} @@ -186,11 +161,9 @@ gdb_expect { } send_gdb "p \t" -sleep 3 gdb_expect { -re "^p \\\x07$"\ { send_gdb "\n" - sleep 1 gdb_expect { -re "The history is empty\\..*$gdb_prompt $"\ { pass "complete 'p '"} @@ -204,7 +177,6 @@ gdb_expect { send_gdb "info t foo\t" -sleep 1 gdb_expect { -re "^info t foo\\\x07$"\ { send_gdb "\n" @@ -220,7 +192,6 @@ gdb_expect { } send_gdb "info t\t" -sleep 1 gdb_expect { -re "^info t\\\x07$"\ { send_gdb "\n" @@ -238,7 +209,6 @@ gdb_expect { send_gdb "info t \t" -sleep 1 gdb_expect { -re "^info t \\\x07$"\ { send_gdb "\n" @@ -256,7 +226,6 @@ gdb_expect { send_gdb "info asdfgh\t" -sleep 1 gdb_expect { -re "^info asdfgh\\\x07$"\ { send_gdb "\n" @@ -274,7 +243,6 @@ gdb_expect { send_gdb "info asdfgh \t" -sleep 1 gdb_expect { -re "^info asdfgh \\\x07$"\ { send_gdb "\n" @@ -291,7 +259,6 @@ gdb_expect { } send_gdb "info\t" -sleep 1 gdb_expect { -re "^info $"\ { send_gdb "\n" @@ -307,7 +274,6 @@ gdb_expect { } send_gdb "info \t" -sleep 1 gdb_expect { -re "^info \\\x07$"\ { send_gdb "\n" @@ -324,12 +290,11 @@ gdb_expect { send_gdb "info \t" -sleep 1 gdb_expect { -re "^info \\\x07$"\ { send_gdb "\t" gdb_expect { - -re "address.*types.*$gdb_prompt info $"\ + -re "address.*types.*$gdb_prompt $"\ { send_gdb "\n" gdb_expect { -re "\"info\".*unambiguous\\..*$gdb_prompt $"\ @@ -365,7 +330,6 @@ gdb_expect { send_gdb "p \"break1\t" -sleep 1 gdb_expect { -re "^p \"break1\\\x07$"\ { send_gdb "\n" @@ -381,20 +345,12 @@ gdb_expect { timeout {fail "(timeout) complete 'p \"break1'"} } } - -re "^p \"break1.*$" - { send_gdb "\n" - gdb_expect { - -re ".*$gdb_prompt $" { fail "complete 'p \"break1'"} - timeout {fail "(timeout) complete 'p \"break1'"} - } - } -re ".*$gdb_prompt $" { fail "complete 'p \"break1'" } timeout { fail "(timeout) complete 'p \"break1'" } } setup_xfail "*-*-*" send_gdb "p \"break1.\t" -sleep 1 gdb_expect { -re "^p \"break1\\.\\\x07$"\ { send_gdb "\n" @@ -410,7 +366,7 @@ gdb_expect { timeout {fail "(timeout) complete 'p \"break1.'"} } } - -re "^p \"break1\\..*$" + -re "^p \"break1\\...*$" { send_gdb "\n" gdb_expect { -re ".*$gdb_prompt $" { fail "complete 'p \"break1.'"} @@ -422,7 +378,6 @@ gdb_expect { } send_gdb "p 'arg\t" -sleep 1 gdb_expect { -re "^p 'arg\\\x07$"\ { send_gdb "\n" @@ -438,12 +393,11 @@ gdb_expect { } send_gdb "p 'arg\t" -sleep 1 gdb_expect { -re "^p 'arg\\\x07$" { send_gdb "\t" gdb_expect { - -re ".*argv.*$gdb_prompt p 'arg$" { + -re ".*argv.*$gdb_prompt $" { send_gdb "\n" gdb_expect { -re "(Invalid character constant\\.|Unmatched single quote\\.).*$gdb_prompt $" { @@ -503,7 +457,6 @@ gdb_expect { # So, I'm hoping that there is no system with a static library variable named # `no_var_by_this_name'. send_gdb "p no_var_named_this-arg\t" -sleep 1 gdb_expect { -re "^p no_var_named_this-arg\\\x07$" { send_gdb "\n" @@ -528,12 +481,11 @@ gdb_expect { } send_gdb "p no_var_named_this-arg\t" -sleep 1 gdb_expect { -re "^p no_var_named_this-arg\\\x07$" { send_gdb "\t" gdb_expect { - -re ".*argv.*$gdb_prompt p no_var_named_this-arg$" { + -re ".*argv.*$gdb_prompt $" { send_gdb "\n" gdb_expect { -re "No symbol \"no_var_named_this\" in current context\\..*$gdb_prompt $" { @@ -548,28 +500,26 @@ gdb_expect { } } -re "(There are $decimal possibilities\\. Do you really\r\nwish to see them all.|Display all $decimal possibilities.) \\(y or n\\)$" { - send_gdb "n" + send_gdb "n\n" + + # Eat the prompt gdb_expect { - -re "\\(gdb\\) p no_var_named_this-arg$" { - send_gdb "\n" - gdb_expect { - -re "No symbol \"no_var_named_this\" in current context\\..*$gdb_prompt $" { - pass "complete (2) 'p no_var_named_this-arg'" - } - -re ".*$gdb_prompt $" { - fail "complete (2) 'p no_var_named_this-arg'" - } - timeout { - fail "(timeout) complete (2) 'p no_var_named_this-arg'" - } - } + -re ".*$gdb_prompt $" { + pass "complete (2) 'p no_var_named_this-arg' (eat prompt)" + } + timeout { fail "(timeout) complete (2) 'p no_var_named_this-'" } + } + + gdb_expect { + -re "No symbol \"no_var_named_this\" in current context\\..*$gdb_prompt $" { + pass "complete (2) 'p no_var_named_this-arg'" } -re ".*$gdb_prompt $" { - fail "complete (2) 'p no_var_named_this-arg'" - } + fail "complete (2) 'p no_var_named_this-arg'" + } timeout { - fail "(timeout) complete (2) 'p no_var_named_this-arg'" - } + fail "(timeout) complete (2) 'p no_var_named_this-arg'" + } } } -re ".*$gdb_prompt $" { @@ -583,37 +533,35 @@ gdb_expect { } send_gdb "p no_var_named_this-\t" -sleep 1 gdb_expect { -re "^p no_var_named_this-\\\x07$" { send_gdb "\t" + gdb_expect { -re "(There are $decimal possibilities\\. Do you really\r\nwish to see them all.|Display all $decimal possibilities.) \\(y or n\\)$" { - send_gdb "n" + send_gdb "n\n" + + # Eat the prompt gdb_expect { - -re "\\(gdb\\) p no_var_named_this-$" { - send_gdb "\n" - gdb_expect { - -re "No symbol \"no_var_named_this\" in current context\\..*$gdb_prompt $" { - pass "complete (2) 'p no_var_named_this-'" - } - -re ".*$gdb_prompt $" { - fail "complete (2) 'p no_var_named_this-'" - } - timeout { - fail "(timeout) complete (2) 'p no_var_named_this-'" - } - } + -re ".*$gdb_prompt $" { + pass "complete (2) 'p no_var_named_this-' (eat prompt)" + } + timeout { fail "(timeout) complete (2) 'p no_var_named_this-'" } + } + + gdb_expect { + -re "No symbol \"no_var_named_this\" in current context\\..*$gdb_prompt $" { + pass "complete (2) 'p no_var_named_this-'" } -re ".*$gdb_prompt $" { - fail "complete (2) 'p no_var_named_this-'" - } + fail "complete (2) 'p no_var_named_this-'" + } timeout { - fail "(timeout) complete (2) 'p no_var_named_this-'" - } + fail "(timeout) complete (2) 'p no_var_named_this-'" + } } } - -re ".*argv.*$gdb_prompt p no_var_named_this-$" { + -re ".*argv.*$gdb_prompt $" { send_gdb "\n" gdb_expect { -re "No symbol \"no_var_named_this\" in current context\\..*$gdb_prompt $" { @@ -638,11 +586,9 @@ gdb_expect { } send_gdb "p values\[0\].a\t" -sleep 3 gdb_expect { -re "^p values.0..a_field $"\ { send_gdb "\n" - sleep 1 gdb_expect { -re "^.* = 0.*$gdb_prompt $"\ { pass "complete 'p values\[0\].a'"} @@ -761,7 +707,6 @@ gdb_test " " "Source directories searche send_gdb "complete file ./gdb.base/compl\n" -sleep 1 gdb_expect { -re "file ./gdb.base/completion\\.exp.*$gdb_prompt $" { pass "complete-command 'file ./gdb.base/compl'"} @@ -770,7 +715,6 @@ gdb_expect { } send_gdb "file ./gdb.base/complet\t" -sleep 1 gdb_expect { -re "^file ./gdb.base/completion\\.exp $"\ { send_gdb "\n" @@ -788,14 +732,12 @@ gdb_expect { } send_gdb "info func marke\t" -sleep 1 gdb_expect { -re "^info func marke.*r$"\ { send_gdb "\t\t" - sleep 3 gdb_expect { - -re "marker1.*$gdb_prompt info func marker$"\ + -re "marker1.*$gdb_prompt $"\ { send_gdb "\n" gdb_expect { -re "All functions matching regular expression \"marker\":.*File.*break1.c:\r\nint marker1\\((void|)\\);\r\nint marker2\\(int\\).*marker3\\(char.*char.*\\).*marker4\\(long( int)?\\);.*$gdb_prompt $"\ @@ -814,9 +756,8 @@ gdb_expect { send_gdb "set follow-fork-mode \t\t" -sleep 1 gdb_expect { - -re "child.*parent.*$gdb_prompt set follow-fork-mode $"\ + -re "child.*parent.*$gdb_prompt $"\ { send_gdb "\n" gdb_expect { -re "Requires an argument.*child.*parent.*$gdb_prompt $"\