This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [RFC] PR 15075 dprintf interferes with "next"
- From: Pedro Alves <palves at redhat dot com>
- To: Hui Zhu <hui_zhu at mentor dot com>
- Cc: Hui Zhu <teawater at gmail dot com>, Tom Tromey <tromey at redhat dot com>, gdb-patches at sourceware dot org, Keith Seitz <keiths at redhat dot com>, Yao Qi <yao at codesourcery dot com>
- Date: Mon, 24 Jun 2013 21:20:10 +0100
- Subject: Re: [RFC] PR 15075 dprintf interferes with "next"
- References: <1361192891-29341-1-git-send-email-yao at codesourcery dot com> <8738wpd3qe dot fsf at fleche dot redhat dot com> <CANFwon3DymreN3ost7ZSrd0deb_sBC6YTzk1fpv8k+7d0ADnLg at mail dot gmail dot com> <5176C14B dot 6010603 at redhat dot com> <CANFwon1tTZTVcn7ieP5=HnPy+2hCKP1my-UE1-Xosp=Q6WrGug at mail dot gmail dot com> <51774714 dot 9060306 at codesourcery dot com> <CANFwon2Q_=++=WbZD25Ch6qnRtpmuVBOsmkqhevyMAnM3y+ZZA at mail dot gmail dot com> <CANFwon0A4wmgEuREeQHYfRWMfn_cct6dHCZ6_oFH+wVr1Wym4A at mail dot gmail dot com> <51969A92 dot 80003 at redhat dot com> <CANFwon3OaNBrvw4jwv_RJ8ws+SVx9NctfTw2FSDVowaxAmgF9Q at mail dot gmail dot com> <519CBE2B dot 7060007 at redhat dot com> <CANFwon0-r4ozDwZ5Av_3Uv_r=FFG4QFRs79-9+g1s0SxjMbUSg at mail dot gmail dot com> <CANFwon0zctGb3jwbYYnUWuAKOctR+7MvFg66bB=iPCCN50UquQ at mail dot gmail dot com> <51ACD6ED dot 7040604 at redhat dot com> <CANFwon2oFaTc0ey4B7z=OXcne42SRwp_mozfOYKU4nx-K+80nA at mail dot gmail dot com> <51C0A274 dot 9010808 at redhat dot com> <51C7CA0C dot 5020809 at mentor dot com>
On 06/24/2013 05:24 AM, Hui Zhu wrote:
>> Hmm, this still looks racy to me, even on native targets.
>> "continue &" produces a gdb prompt. gdb_test_multiple
>> inside has a match for the prompt:
>>
>> -re "\r\n$gdb_prompt $" {
>> if ![string match "" $message] then {
>> fail "$message"
>> }
>> set result 1
>> }
>>
>> So if the expect happens to read
>>
>> continue &
>> (gdb)
>>
>> from the buffer, we'll hit the fail. Doesn't the read1 hack catch this?
>
> EXPECT=../contrib/expect-read1.sh make check RUNTESTFLAGS="dprintf-non-stop.exp" is OK in my part.
I suspect the "exec sleep 1" is masking it. If you remove the sleep,
then the test fails.
>
>>
>> We need to consume the prompt after that "continue&".
>>
>>> + }
>>> +}
>>> +
>>> +set test "inferior stopped"
>>> +gdb_test_multiple "" $test {
>>> + -re "\r\n\\\[.* \[0-9\]+\\\] #1 stopped\\\.\r\n" {
>>> + pass $test
>>> + }
>>> +}
>>
>> Likewise?
>>
>
> I just copy this part of code from "gdb.base/async-shell.exp".
> Could you give me some help about how to consume the prompt after that "continue&"?
Just doing:
-send_gdb "continue &\n"
+gdb_test "continue &" "Continuing\\."
will consume the prompt. Otherwise, we'd do like
e.g., completion.exp does:
# Eat the prompt
gdb_expect {
-re "$gdb_prompt " {
pass "$test (eat prompt)"
}
timeout {
fail "(timeout) $test (eat prompt)"
}
}
We still need the sleep, but for different a reason -- be sure
to wait for the dprintf to trigger -- we need GDB to print the
prompt before the program reaches the dprintf. I think it's slightly
better to do the sleep on the inferior program side. We can expect
the "At foo entry" output from the dprintf, as the default "set dprintf-style"
is "gdb".
I see now that the
set test "inferior stopped"
gdb_test_multiple "" $test {
-re "\r\n\\\[.* \[0-9\]+\\\] #1 stopped\\\.\r\n" {
pass $test
}
}
case doesn't need to eat the prompt, as that output appears
after the prompt:
(gdb) PASS: gdb.base/dprintf-non-stop.exp: continue &
At foo entry
PASS: gdb.base/dprintf-non-stop.exp: dprintf triggered
interrupt
(gdb)
[process 6106] #1 stopped.
PASS: gdb.base/dprintf-non-stop.exp: interrupt
PASS: gdb.base/dprintf-non-stop.exp: inferior stopped
and the "interrupt" test already eats it.
See patchlet on top of yours below. Please merge it with
yours, and push the result in (and post it, for the archives).
Thanks,
Pedro Alves
---
gdb/testsuite/gdb.base/dprintf-non-stop.c | 1 +
gdb/testsuite/gdb.base/dprintf-non-stop.exp | 17 +++++++++++++++--
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/gdb/testsuite/gdb.base/dprintf-non-stop.c b/gdb/testsuite/gdb.base/dprintf-non-stop.c
index 2198848..2d25d9e 100644
--- a/gdb/testsuite/gdb.base/dprintf-non-stop.c
+++ b/gdb/testsuite/gdb.base/dprintf-non-stop.c
@@ -23,6 +23,7 @@ foo ()
int
main ()
{
+ sleep (1);
foo ();
sleep (3);
return 0;
diff --git a/gdb/testsuite/gdb.base/dprintf-non-stop.exp b/gdb/testsuite/gdb.base/dprintf-non-stop.exp
index c3fb85e..707f913 100644
--- a/gdb/testsuite/gdb.base/dprintf-non-stop.exp
+++ b/gdb/testsuite/gdb.base/dprintf-non-stop.exp
@@ -36,9 +36,22 @@ if ![runto main] {
gdb_test "dprintf foo,\"At foo entry\\n\"" "Dprintf .*"
-send_gdb "continue &\n"
-exec sleep 1
+gdb_test "continue &" "Continuing\\."
+# Wait for the dprintf to trigger.
+set test "dprintf triggered"
+gdb_expect {
+ -re "At foo entry" {
+ pass "$test"
+ }
+ timeout {
+ fail "$test (timeout)"
+ }
+}
+
+# Now test that we're still able to issue commands. GDB used to
+# implement re-resuming from dprintfs with a synchronous "continue" in
+# the dprintf's command list, which stole the prompt from the user.
set test "interrupt"
gdb_test_multiple $test $test {
-re "interrupt\r\n$gdb_prompt " {
--
1.7.11.7