From: Pedro Alves <palves@redhat.com>
To: Yao Qi <qiyaoltc@gmail.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH 5/6] testsuite: Introduce $inferior_spawn_id
Date: Fri, 27 Feb 2015 10:42:00 -0000 [thread overview]
Message-ID: <54F04A2B.5@redhat.com> (raw)
In-Reply-To: <867fv7xodw.fsf@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 2663 bytes --]
On 02/24/2015 04:31 PM, Yao Qi wrote:
> Pedro Alves <palves@redhat.com> writes:
>
> Hi Pedro,
>
>> + # GDBserver doesn't do inferior I/O through GDB. But we can
>> + # talk to the program using GDBserver's tty instead.
>> + global inferior_spawn_id
>> + set inferior_spawn_id $server_spawn_id
>
> Does it still work well if GDBserver is started without tty? In my
> remote testing, gdbserver is started without tty,
>
> spawn /usr/bin/ssh -l yao junor1 /gdbserver/aarch64/gdbserver --once :2346 aarch64-linux-gnu/gdb/testsuite/gdb.base/interrupt
>
> I see the following timeouts:
>
> Continuing.^M
> Remote debugging from host 10.2.206.34^M
> FAIL: gdb.base/interrupt.exp: process is alive (timeout)
> a^M
> a^M
> FAIL: gdb.base/interrupt.exp: child process ate our char (timeout)
I tried it now, and the problem is that when the gdbserver/inferior is
started without a tty, then stdout is put in unbuffered mode, so the
printf calls don't flush...
Adding:
setvbuf (stdout, NULL, _IONBF, BUFSIZ);
to interrupt.c fixes it.
This is the same problem we see when testing with Windows (native or
remote) from Cygwin, given in that case stdin/stdout is connected
to a pipe.
Long ago I added the set_unbuffered_mode.c hack to for this. So enabling
that hack fixes this too then. See patch below. (I also hacked
native-gdbserver.exp locally to use ssh with no -t to test it). That would
require boards to set that gdb,force_unbuffered_mode flag if they need it.
But I'm not sure we want to expose that to boards. We could also
always enable the hack for gdbserver in gdbserver-support.exp.
Or we could fix the tests themselves to explicitly call setvbuf
if needed and not bother boards at all. I count only around 20
tests that check gdb,noinferiorio, or use gdb_skip_stdio_test, and
we could fix them incrementally, as they're converted to
use $inferior_spawn_id. Maybe that's the cleanest. We can
e.g., add:
#include "lib/set_unbuffered_mode.c"
at the top of such files, which avoids an explicit call in
"main". That relies on __attribute__ ((constructor)), but
we could also call an helper shared function that does the
setvbuf from the tests' "main" if we don't want to rely on
that attribute.
Options, options...
>
> We need to override ${board}_spawn and pass "-t" to ssh. After this change,
> all interrupt.exp tests pass. Since the test harness assumes GDBserver
> has tty, probably we should document such requirement somewhere.
That's an option too, but it makes me a bit nervous. I'm not sure
if we can assume that.
>
> However, I don't run the whole testsuite with the updated board file
> (with -t option to ssh).
>
[-- Attachment #2: 0001-Add-a-way-for-boards-to-request-usage-of-the-force-u.patch --]
[-- Type: text/x-patch, Size: 2298 bytes --]
From c4f1429d5274f9729cd3254813bacfda48f7ef95 Mon Sep 17 00:00:00 2001
From: Pedro Alves <palves@redhat.com>
Date: Thu, 26 Feb 2015 23:18:12 +0000
Subject: [PATCH] Add a way for boards to request usage of the
force-unbuffered-mode trick
---
gdb/testsuite/boards/native-gdbserver.exp | 2 ++
gdb/testsuite/lib/gdb.exp | 16 ++++++++++++----
2 files changed, 14 insertions(+), 4 deletions(-)
diff --git a/gdb/testsuite/boards/native-gdbserver.exp b/gdb/testsuite/boards/native-gdbserver.exp
index f00ef60..b3bc889 100644
--- a/gdb/testsuite/boards/native-gdbserver.exp
+++ b/gdb/testsuite/boards/native-gdbserver.exp
@@ -26,6 +26,8 @@ load_board_description "gdbserver-base"
# This gdbserver can only run a process once per session.
set_board_info gdb,do_reload_on_run 1
+set_board_info gdb,force_unbuffered_mode 1
+
# There's no support for argument-passing (yet).
set_board_info noargs 1
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index e4722d2..e7d5e48 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -2850,6 +2850,13 @@ proc gdb_wrapper_init { args } {
global gdb_saved_set_unbuffered_mode_obj
set gdb_saved_set_unbuffered_mode_obj ""
+proc force_unbuffered_mode_p {} {
+ if {[target_info exists gdb,force_unbuffered_mode] && [target_info gdb,force_unbuffered_mode]} {
+ return 1
+ }
+ return 0
+}
+
proc gdb_compile {source dest type options} {
global GDB_TESTCASE_OPTIONS
global gdb_wrapper_file
@@ -2947,13 +2954,14 @@ proc gdb_compile {source dest type options} {
}
if { $type == "executable" } {
- if { ([istarget "*-*-mingw*"]
- || [istarget "*-*-*djgpp"]
- || [istarget "*-*-cygwin*"])} {
+ if { [force_unbuffered_mode_p]
+ || [istarget "*-*-mingw*"]
+ || [istarget "*-*-*djgpp"]
+ || [istarget "*-*-cygwin*"]} {
# Force output to unbuffered mode, by linking in an object file
# with a global contructor that calls setvbuf.
#
- # Compile the special object seperatelly for two reasons:
+ # Compile the special object seperately for two reasons:
# 1) Insulate it from $options.
# 2) Avoid compiling it for every gdb_compile invocation,
# which is time consuming, especially if we're remote
--
1.9.3
next prev parent reply other threads:[~2015-02-27 10:42 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-23 13:54 [PATCH 0/6] Introduce $inferior_spawn_id, make interrupt.exp work with GDBserver Pedro Alves
2015-02-23 13:54 ` [PATCH 3/6] gdb_test_multiple: Fix user code argument processing Pedro Alves
2015-02-23 13:54 ` [PATCH 1/6] gdb.base/interrupt.exp: Fix race Pedro Alves
2015-02-23 13:54 ` [PATCH 4/6] testsuite: Don't use expect_background to reap gdbserver Pedro Alves
2015-04-13 11:42 ` Yao Qi
2015-04-13 12:09 ` Pedro Alves
2015-04-13 13:25 ` Yao Qi
2015-04-13 13:52 ` Pedro Alves
2015-04-13 14:20 ` Yao Qi
2015-04-13 14:22 ` Pedro Alves
2015-04-13 14:48 ` Yao Qi
2015-02-23 13:54 ` [PATCH 2/6] gdb.base/interrupt.exp: Use gdb_test_multiple instead of gdb_expect Pedro Alves
2015-02-23 13:54 ` [PATCH 6/6] gdb.base/interrupt.exp: Use send_inferior/$inferior_spawn_id Pedro Alves
2015-02-23 14:28 ` [PATCH 5/6] testsuite: Introduce $inferior_spawn_id Pedro Alves
2015-02-24 16:31 ` Yao Qi
2015-02-27 10:42 ` Pedro Alves [this message]
2015-02-27 10:59 ` Pedro Alves
2015-02-27 11:01 ` Pedro Alves
2015-02-27 12:12 ` Yao Qi
2015-02-27 13:59 ` [pushed] Add "../lib/unbuffer_output.c" and use it in gdb.base/interrupt.c (Re: [PATCH 5/6] testsuite: Introduce $inferior_spawn_id) Pedro Alves
2015-02-27 14:13 ` Yao Qi
2015-02-27 14:42 ` Eli Zaretskii
2015-02-27 14:47 ` Pedro Alves
2015-02-27 12:08 ` [PATCH 5/6] testsuite: Introduce $inferior_spawn_id Yao Qi
2015-02-27 12:30 ` Pedro Alves
2015-04-16 16:55 ` Antoine Tremblay
2015-04-16 17:14 ` Pedro Alves
2015-04-21 18:25 ` Pedro Alves
2015-04-21 18:32 ` Antoine Tremblay
2015-04-07 17:31 ` [PATCH 0/6] Introduce $inferior_spawn_id, make interrupt.exp work with GDBserver Pedro Alves
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=54F04A2B.5@redhat.com \
--to=palves@redhat.com \
--cc=gdb-patches@sourceware.org \
--cc=qiyaoltc@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox